如何解决如何在天文钟上使用前台服务?
我是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 举报,一经查实,本站将立刻删除。