如何在天文钟上使用前台服务?

问题描述

我是Java的Android编程的新手,我目前正在迈出第一步,创建一个秒表,该秒表在App处于后台时保持运行。现在,秒表运行正常,启动/停止运行正常,格式为hh:mm:ss。

但是:如果内存压力越来越大(例如在短时间内打开其他应用程序)或长时间不使用,则应用程序将保持关闭状态。

现在,我在文档中阅读了很多内容,在这里,让应用程序在后台(离线)运行的最佳选择是服务。我似乎无法以某种方式正确实现服务。我尝试制作一个扩展服务的“ MyService”类,将其放入XML并在按下“开始”时调用“ StartService”-方法。我已经花了三天的时间从网上尝试各种尝试和教程,但是不幸的是,如果不使用该应用程序,它将永远无法运行。

现在我发现,一旦服务运行(尚未运行),您就可以将其放到前台,其中包括一个诸如“计时器正在运行”之类的通知。

如何使用一旦按下“停止”按钮就被杀死的“永无止境”服务?

MainActivity的代码:

package com.example.bracetime;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Chronometer;

public class MainActivity extends AppCompatActivity {

    Intent intent;
    Chronometer chronometer;
    private long stopOffset;
    private boolean running = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        chronometer  = (Chronometer) findViewById(R.id.chronometer);
        chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {

            @Override
            public void onChronometerTick(Chronometer cArg) {
                long time = SystemClock.elapsedRealtime() - cArg.getBase();
                int h   = (int)(time /3600000);
                int m = (int)(time - h*3600000)/60000;
                int s= (int)(time - h*3600000- m*60000)/1000 ;
                String hh = h < 10 ? "0"+h: h+"";
                String mm = m < 10 ? "0"+m: m+"";
                String ss = s < 10 ? "0"+s: s+"";
                cArg.setText(String.format("%02d:%02d:%02d",h,m,s ));
            }
        });

        chronometer.setBase(SystemClock.elapsedRealtime());
        chronometer.setText("00:00:00");

    }
    @RequiresApi(api = Build.VERSION_CODES.O)
    public void startChronometer(View v) {
        if (!running) {
            chronometer.setBase(SystemClock.elapsedRealtime() - stopOffset);
            chronometer.start();
            intent = new Intent(this,MyService.class);
            startForegroundService(intent);
            running = true;
        }

    }

    public void stopChronometer(View v) {
        if (running) {
            chronometer.stop();
            stopOffset = SystemClock.elapsedRealtime() - chronometer.getBase();
            stopService(intent);
            running = false;

        }

    }

}

这是服务类的代码

package com.example.bracetime;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

import androidx.annotation.Nullable;

public class MyService extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent,int flags,int startId) {
        return Service.START_STICKY;
    }
}

包含XML服务(AndroidManifest.xml):

        <service
            android:name="MyService"
            android:label="BraceTime"
            ></service>

任何想法表示赞赏:)预先感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)