Android处理点击通知

时间:2017-03-16 08:38:00

标签: android android-intent activity-stack

我的应用程序中有这种情况:我有这些活动

<activity
            android:name=".presentation.view.start.view.activity.StartActivity"
            android:screenOrientation="sensorPortrait"
            android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".presentation.view.main.view.activity.MainActivity"
            android:configChanges="locale"
            android:screenOrientation="sensorPortrait"
            android:theme="@style/AppThemeMultiStep"
            android:windowSoftInputMode="stateAlwaysHidden" />
        <activity
            android:name=".presentation.view.firstScreen.view.activity.FirstScreenActivity"
            android:screenOrientation="sensorPortrait"
            android:theme="@style/AppThemeMultiStep"
            android:windowSoftInputMode="stateAlwaysHidden" />
        <activity
            android:name=".presentation.view.signup.view.activity.LoginViaPinActivity"
            android:screenOrientation="sensorPortrait"
            android:theme="@style/AppThemeMultiStep" />

StartActivity基于应用程序状态充当一种“路由器”:

  • 如果我未登录,则会启动FirstScreenActivity
  • 如果我已登录,它将启动LoginViaPinActivity,它将根据某些逻辑登录用户,然后启动MainActivity。最后,MainActivity将成为活动堆栈的根源。

在某些时候,应用会收到通知,当我点按它时,我想要这个:

如果应用程序正在运行并且MainActivity正在运行,请打开MainActivity(这很简单,我可以通过各种标志实现这种方式)但是如果它没有运行启动StartActivity(这样我就可以打开应用程序了所有在那里实现的启动逻辑。)

所以我能想到的选择是:

  • 知道某个活动是否正在运行以激发意图或其他活动(我不喜欢像您在许多与此相关的SO帖子中读取的静态字段解决方案)

  • 使StartActivity成为任务的根,并找到一个意图标志组合,它们的行为类似于“启动StartActivity,但如果它在任务的根目录下运行,则将该任务置于最前面”(这将是如果可能,我的首选方案)

  • 任何建议都非常感谢

你通常如何处理这种情况? (我不认为我是世界上第一个遇到这个问题的人:))

1 个答案:

答案 0 :(得分:0)

这是我的方法 -

如您所说,将StartActivity设为您的路由器。只需将清单中的启动模式设为singleTop,即可使用onNewIntent()的{​​{1}}方法。

您将生成通知,并使用Activity发送一些数据 - 因此点击通知您将被重定向到contentIntent

这里有两个案例 -

  • 如果StartActivity在堆叠中 用你的新意图调用StartActivity - 选择你需要打开的活动 -
    如果它已经在堆栈中使用onNewIntent标志

    <将它带到前面/ LI>
  • 如果FLAG_ACTIVITY_REORDER_TO_FRONT未在堆栈中运行
    通过通知接收通过意图获得的StartActivity bundle,解析数据并相应地打开活动。