Android - 从通知中重新打开主要活动

时间:2016-03-25 18:44:02

标签: android android-activity android-notifications

我的应用的启动器活动称为 LaunchActivity 。在此活动中,我检查用户是否已登录。如果是,则进行网络呼叫以验证用户,如果一切正常,则启动 MainActivity 。如果用户首次运行应用或用户验证失败,则 LoginActivity 会运行。

在LaunchActivity内部,有一个运行适当活动的函数:

private void start(Class<? extends Activity> startActivity) {

    Intent intent = new Intent(this, startActivity);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    finish();
    startActivity(intent);
}

应用正在接收通知。通知后点击我想打开应用程序或将其置于顶部,如果它是在背景上。

负责通知意图的代码:

   Intent intent = new Intent(context, LaunchActivity.class);
    intent.putExtra("SHOW_NOTIFICATION_LIST", "");
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);

    PendingIntent notificationIntent = PendingIntent.getActivity(
            context,
            0,
            intent,
            0);
    builder.setContentIntent(notificationIntent);

    Notification notification = builder.build();

问题在于,点击后我的当前实现,即使MainActivity在后台,也会重新打开LaunchActivity。如果它在背景上,我无法弄清楚如何将待处理的意图重新打开 MainActivity (没有LaunchActivity和valdation)或者当背景上没有活动运行时启动 LaunchActivity (app没有运行)。我会非常感谢任何帮助。

编辑:

清单中的活动声明:

        <activity android:name=".activities.LaunchActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".activities.MainActivity"
        android:launchMode="singleTop"
        android:screenOrientation="userPortrait" />
    <activity
        android:name=".activities.LoginActivity"
        android:excludeFromRecents="true"
        android:launchMode="singleTop"
        android:noHistory="true"
        android:screenOrientation="userPortrait"
        android:windowSoftInputMode="adjustResize" >
    </activity>

2 个答案:

答案 0 :(得分:0)

创建一个对三种不同意图做出反应的BroadcastReceiver

  • ACTION_CREATED:将flag设置为true
  • ACTION_DESTROYED:将flag设置为false
  • ACTION_LAUNCH:如果是国旗,请启动MainActivity,否则启动LaunchActivity

(flag可以是例如sharedpreferences中的布尔值或静态字段)

MainActivity中的

  • onCreate中:发送ACTION_CREATED广播
  • onDestroy中:发送ACTION_DESTROYED广播

通知应发送ACTION_LAUNCH广播。

注意:操作可以命名为您想要的任何名称。它们也应该从您的包名开始,因此您不会干扰其他应用程序。

答案 1 :(得分:0)

荒谬行为的原因在于,当您致电LaunchActivity时,您正在完成start()

private void start(Class<? extends Activity> startActivity) {

   ....
    finish(); // This is the culprit
  ....
}

finish()移除start(),它将按预期正常工作。

如果由于您的应用行为而无法移除finish(),请将PendingIntent更改为启动MainActivity而不是LaunchActivity

Intent intent = new Intent(context, MainActivity.class);

并在MainActivity's onCreate()中检查用户是否已登录。如果没有,请将他导航到您的LoginActivity