我有两个活动,mainActivityCaller和mainActivity,其中activity mainActivityCaller通过startActivity()方法启动activity 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);
    }
}

在清单文件中,mainActivity被声明为只能在一个任务中启动
<activity android:name=".MainActivity"
    android:launchMode="singleTask" />

现在,这将创建或重新启动mainactivity(取决于mainactivity是否被销毁或停止)。在任何任务后堆栈中都不存在mainActivity实例时,如何修改此设置以启动mainActivityCaller?
谢谢!

最佳答案

你要在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);
    }
}

09-10 08:12
查看更多