我有一个警报应用程序。 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()。
答案 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。一旦成立,就意味着已触发的活动已经完成。现在我可以继续发布唤醒锁。
我很高兴收到有关我的方法和评论的评论。任何有关我的问题的更好解决方案的建议,而不是我所设想的。