IntentService - Wakelock发布问题

时间:2016-10-02 07:06:24

标签: android android-intent broadcastreceiver intentservice wakelock

我有一个警报应用程序。 Flow看起来像这样:

  

WakefulBroadcastReceiver(获取wakelock)--->>意图服务 - >> startActivity

public class AlarmService extends IntentService {
    protected void onHandleIntent(Intent intent) {
        Intent activityIntent = new Intent(this, TriggeredActivity.class);
        activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(activityIntent);

基本上WakefulBroadcaseReceiver使用startWakefulService()启动一个intent服务。在内部意图服务的onHandleIntent()中,我正在做的工作是使用startActivity()进一步开始新的活动。这个新活动是我在循环中使用mediaPlayer的地方,这听起来很惊人。该活动有一个关闭按钮,等待用户点击停止媒体播放器&活动结束。 现在我面临的问题是在意图服务中调用startactivity()之后,我不能等待TriggeredActivity完成(不等同于Service中的startActivityForResult),然后完成唤醒意图。相关link

  

startActivity(activityIntent);       WakefulBCastReceiver.completeWakefulIntent(意向); / *不能在这里* /

所以我没有在这里明确发布唤醒锁。

我的问题是,当持有它的进程被杀死时,将自动释放唤醒锁(链接到死亡)。 如果是,那么在我的特定场景中,我不需要调用WakefulBCastReceiver.completeWakefulIntent()。

2 个答案:

答案 0 :(得分:0)

是的,您需要使用 completeWakefulIntent

您需要将 TriggeredActivity 意图放入EXTRAs。

@Override
public void onReceive(Context context, Intent intent) {

    Intent intentService = new Intent(context, NotificationsIntentService.class);
    // Inserting data inside the Intent
    intentService.putExtra(NotificationsIntentService.EXTRA_NOTIF, new Intent(context, TriggeredActivity.class));
    startWakefulService(context, intentService);
}

<强> NotificationsIntentService.class

public class NotificationsIntentService extends IntentService {

     private static final String TAG = "DebugNotifIntent";

     public static final String EXTRA_NOTIF = "extra_notif";

     public NotificationsIntentService(){
         super(NotificationsIntentService.class.getSimpleName());
     }

     @Override
     protected void onHandleIntent(Intent intent) {
          Log.d(TAG, "onHandleIntent: ");
          Intent extraIntent = intent.getParcelableExtra(EXTRA_NOTIF);
          extraIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          startActivity(extraIntent);

          NotificationWakefulBroadcastReceiver.completeWakefulIntent(intent);
     }

     @Override
     public void onDestroy() {
         super.onDestroy();
         Log.d(TAG, "onDestroy: ");
     }
}

答案 1 :(得分:0)

我设法为我的问题找到了解决方案。我现在正在使用Messenger在意图服务和意外服务之间进行基于消息的跨进程通信。触发活动。 我正在传递一个处理程序 - alarmServiceHandler,从意向服务到通过信使的活动。

Handler alarmServiceHandler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        if(msg.arg1 == 1) {
            completedTriggeredActivity = true;
        }
    }
};

在onHandleIntent()中,我在intent的额外数据中通过Messenger对象传递处理程序。

    Messenger alarmServiceMessenger = new Messenger(alarmServiceHandler);
    Intent activityIntent = new Intent(this, TriggeredActivity.class);
    activityIntent.putExtra("AlarmServiceMessenger", alarmServiceMessenger);
    activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(activityIntent);


    while(!completedTriggeredActivity){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    WakefulBCastReceiver.completeWakefulIntent(intent);

在TriggeredActivity中,我正在调用活动中的finish()之前,在Dismiss按钮的OnClickListener中检索信使。并使用arg = 1将消息发送回AlarmService,这意味着触发活动中的处理结束。

buttonDismiss.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Messenger alarmServiceMessenger = getIntent().getParcelableExtra("AlarmServiceMessenger");
                Message alarmServiceMessage = Message.obtain();
                alarmServiceMessage.arg1 = 1;
                try {
                    alarmServiceMessenger.send(alarmServiceMessage);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }

                finish();

            }

在启动触发活动后,我将AlarmService置于睡眠模式,直到在handleMessage()中布尔变量completedTriggeredActivity尚未设置为true。一旦成立,就意味着已触发的活动已经完成。现在我可以继续发布唤醒锁。

我很高兴收到有关我的方法和评论的评论。任何有关我的问题的更好解决方案的建议,而不是我所设想的。