我有两个活动,MainActivityCaller和MainActivity,活动MainActivityCaller通过startActivity()方法启动活动MainActivity。
从通知中,我想启动活动MainActivity,如果它已暂停但存在于任务后台堆栈中(使用下面的代码完成),但是如果没有,则启动MainActivityCaller(即,如果MainActivity实例已经被用户或系统销毁。
当用户的位置发生变化时,MainActivity会广播以下内容
@Override
public void onLocationChanged(Location location) {
final Location finalLocation = location;
final Intent restartMainActivity = new Intent(this, MainActivity.class);
sendOrderedBroadcast(
new Intent(LOCATION_CHANGED_ACTION),
null,
new BroadcastReceiver() {
@TargetApi(16)
@Override
public void onReceive(Context context, Intent intent) {
if (getResultCode() != RESULT_OK) {
PendingIntent pi = PendingIntent.getActivity(context, 0, restartMainActivity, 0);
Notification.Builder nb = new Notification.Builder(context)
.setAutoCancel(true)
.setContentText("Lat = " + Double.toString(finalLocation.getLatitude()) + "\nLong = " + Double.toString(finalLocation.getLongitude()))
.setContentIntent(pi)
.setSmallIcon(android.R.drawable.stat_sys_warning));
NotificationManager nm = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
nm.notify(0, nb.build());
}
}
},
null,
0,
null,
null);
}
MainActivity还有一个在onCreate方法中实例化的广播接收器(下面的缩写版本)
@Override
protected void onCreate(Bundle savedInstanceState) {
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (isOrderedBroadcast())
setResultCode(RESULT_OK);
}
};
}
接收器在onResume方法中注册
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter(LOCATION_CHANGED_ACTION);
registerReceiver(mReceiver, intentFilter);
}
在onPause方法中取消注册
@Override
protected void onPause() {
super.onPause();
if (mReceiver != null) {
unregisterReceiver(mReceiver);
}
}
在Manifest文件中,MainActivity被声明为只能在一个任务中启动
<activity android:name=".MainActivity"
android:launchMode="singleTask" />
现在,这会创建或重新启动MainActivity(取决于MainActivity是否被销毁或停止)。如果在任何任务后台堆栈中不存在MainActivity实例,如何修改它以启动MainActivityCaller?
谢谢!
答案 0 :(得分:1)
您需要在AndroidManifest.xml中注册广播接收器,使接收器成为公共Java类,并让接收器(重新)启动活动。
在AndroidManifest.xml中:
<receiver
android:name=".RestarteActivityBR"
android:exported="false">
<intent-filter>
<action android:name="com.example.intent.restart" />
</intent-filter>
</receiver>
在RestartActivityBR.java中:
public class RestartActivityBR extends BroadcastReceiver
{
@Override
public void onReceive(final Context context, final Intent intent)
{
Intent main = new Intent(context, AppMain.class);
main.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(main);
}
}
答案 1 :(得分:0)
我之前没有尝试过,但我会尝试将指向我的Notification
对象的指针作为类变量,然后将contentIntent
属性更改为不同的PendingIntent。进行简单的硬编码测试,看看是否有效。
如果以上方法有效,那么...... MainActivity
需要通知服务它是否存在(服务无法猜测),因此您可以使用onPause()和onResume()来通知活动所在的服务。