该应用程序有一项服务,必须检测应用程序运行的时间,并根据该服务,该服务将启动misc操作。
实现这个的正确方法是什么?
如果应用程序在用户面前运行,我怎么能确定服务是否正在运行?
启动服务似乎很简单 - 只需在启动加载时启动即可。但更难的部分是结束它。当用户按下最后一个屏幕上的“返回”按钮时,我无法结束它。如何处理用户按主屏幕或其他某个应用程序(如电话,或viber弹出窗口或...)的情况会占用屏幕?
我尝试从其他主题(How to start a android service from one activity and stop service in another activity?)获取建议,但这并不能处理主页按钮或其他应用程序接管屏幕的情况。
该应用程序总共有大约10项活动。这是将这项服务绑定到所有10项活动的正确方法,当所有这些活动都关闭时,服务会自动关闭吗?
答案 0 :(得分:2)
为您的所有活动制作BaseActivity。在BaseActivity中,执行以下操作:
public class MyActivity extends Activity implements ServiceConnection {
//you may add @override, it's optional
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, MyService.class);
bindService(intent, this, 0);
}
//you may add @override, it's optional
protected void onStop() {
super.onStop();
unbindService(this);
}
public void onServiceConnected(ComponentName name, IBinder binder) {};
public void onServiceDisconnected(ComponentName name) {};
/* lots of other stuff ... */
}
您的BaseActivity需要实现ServiceConnection接口(或者您可以使用匿名内部类),但您可以将这些方法留空。
在Service类中,您需要实现onBind(Intent)
方法并返回IBinder。最简单的方法是这样:
public class MyService extends Service {
private final IBinder localBinder = new LocalBinder();
public void onCreate() {
super.onCreate();
// first time the service is bound, it will be created
// you can start up your timed-operations here
}
public IBinder onBind(Intent intent) {
return localBinder;
}
public void onUnbind(Intent intent) {
// called when the last Activity is unbound from this service
// stop your timed operations here
}
public class LocalBinder extends Binder {
MyService getService() {
return MyService.this;
}
}
}
答案 1 :(得分:1)
Bound Service是专门为此目的定义的,您可以将活动绑定到它,当所有活动都消失时,它也将被停止。该链接应包含足够的细节供您实施。