我正在计算用户使用手机的时间,所以我使用了接收器 它在MainActivity中注册然后我启动TimeService也是registring接收器,所以它可以工作,即使用户在其他活动或应用程序。
MainActivity
private void registerScreenReceiver(){
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
}
TimeService
public class TimeService extends Service {
//
@Override
public void onCreate() {
super.onCreate();
// REGISTER RECEIVER THAT HANDLES SCREEN ON AND SCREEN OFF LOGIC
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
}
@Override
public int onStartCommand(Intent intent, int flags, int start_id) {
boolean screenOn = intent.getBooleanExtra("screen_state", false);
if (!screenOn) {
Log.e("SERVICE","ON");
} else {
Log.e("SERVICE","OFF");
}
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
问题在于,当我不使用应用程序时,它会被自己关闭,接收器不再被打开。
答案 0 :(得分:1)
您必须在onStartCommand()
中返回START_STICKY以保持Service
正常工作。
您还可以将Service
设置为前景 Service
,但这需要在状态栏中显示通知,这可能不是一个坏主意。 Here is an example
<强>更新强>
如果您在AndroidManifest.xml中注册BroadcastReceiver
并在系统唤醒时从接收器启动Service
,那可能会更好。