在服务中使用接收器

时间:2014-08-14 18:33:30

标签: android android-service android-broadcast

我正在计算用户使用手机的时间,所以我使用了接收器 它在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;
    }
}

问题在于,当我不使用应用程序时,它会被自己关闭,接收器不再被打开。

1 个答案:

答案 0 :(得分:1)

您必须在onStartCommand()中返回START_STICKY以保持Service正常工作。

您还可以将Service设置为前景 Service,但这需要在状态栏中显示通知,这可能不是一个坏主意。 Here is an example

<强>更新

如果您在AndroidManifest.xml中注册BroadcastReceiver并在系统唤醒时从接收器启动Service,那可能会更好。