【问题标题】:Resume activity from notification calling onCreate从调用 onCreate 的通知恢复活动
【发布时间】:2016-07-13 10:50:24
【问题描述】:

我正在尝试从通知中恢复我的活动,但它正在重新创建活动而不是恢复。

在所有关于此问题的帖子中,提及创建 PendingIntent 并使用适当的标志设置它(如下面的代码所示),并将 singleTop|singleInstance 添加到 AndroidManifest。

通知代码:

NotificationManager mNotifyMan = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        mNotifyMan.cancelAll();
        Notification.Builder mNB = new Notification.Builder(this);
        mNB.setOngoing(true);
        Intent intent = new Intent(parentContext, main.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
        PendingIntent pendingIntent = PendingIntent.getActivity(parentContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        mNB.setContentIntent(pendingIntent);
        mNB.setSmallIcon(R.drawable.ic_notify_icon);
        mNB.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_noti_large));
        mNB.setContentTitle(Title);
        mNB.setContentText(Message);
        mNB.setColor(0);
        mNotifyMan.notify(777, mNB.build());

我知道必须通过当前上下文传递一个意图。

当通过onResume() 上的onPause() 恢复活动时,它会恢复并恢复上一个活动状态,即运行的线程计数器具有递增的值。

问题:

从通知中恢复时(即单击通知),将重新创建活动。我试图解决这个问题

onPause()被执行时,通过基类将当前活动状态发送到通知,从而用当前状态重新创建通知。

这是我的 AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.cynetstudios.wifimanager">

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-feature android:name="android.hardware.wifi" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:launchMode="singleInstance">

        <activity android:name="com.cynetstudios.frequencyselector.main" android:configChanges="orientation|screenSize|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.cynetstudios.frequencyselector.serviceWifiFreqManager" android:exported="false"/>
    </application>

</manifest>

我可能遗漏了一些琐碎的事情,有什么建议吗?

【问题讨论】:

  • 使用singleInstance 启动模式不是处理这个问题的正确方法。如果您的应用程序有超过 1 个Activity,它将大大破坏您的应用程序。你应该看看stackoverflow.com/questions/5502427/…

标签: android android-intent android-activity notifications


【解决方案1】:

您可以根据您希望 Activity 的行为方式设置 Activity 的 launchModeSingleTaskSingleTopSingleInstance

如果您的活动在用户单击您的活动通知时打开,则稍后您可以处理活动的 onNewIntent 方法。

您还需要在 atcitvity 部分定义活动的启动模式。我编辑了你的 xml。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.cynetstudios.wifimanager">

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-feature android:name="android.hardware.wifi" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name="com.cynetstudios.frequencyselector.main"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:launchMode="singleInstance">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.cynetstudios.frequencyselector.serviceWifiFreqManager" android:exported="false"/>
    </application>

</manifest>

希望对你有帮助。

【讨论】:

    【解决方案2】:

    launchMode 应该用在 Activity 部分(不是应用程序)

    【讨论】:

    • 谢谢,我遵循的指南在应用程序标签中显示了launchMode,这有效,谢谢
    【解决方案3】:
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    intent.setClass(this, main.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
    startActivity(intent);
    

    你可以试试这个 Intent。这样的意图被系统应用启动器使用,如果它没有被杀死,它只会显示(不重新创建)你的活动。

    【讨论】:

    • 这行得通,但它不调用onNewIntent,所以我不能在 Intent 中添加额外的东西,可以使用......知道如何克服这个问题吗?
    • 我使用 Rxbus 发送额外的数据。当 AMS 处理 ActivityRecord 和任务历史记录时,上述意图似乎不能采取额外措施
    【解决方案4】:

    试试

    Intent.FLAG_ACTIVITY_CLEAR_TOP

    Intent.FLAG_ACTIVITY_NEW_TASK

    将它们设置为意图的标志

    【讨论】:

    • 根据文档,CLEAR_TOP 清除所有活动,直到该活动所在的位置,从而将其置于顶部
    • 这意味着它不会启动一个新的activity实例
    【解决方案5】:

    试试这个可能对你有帮助:

    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    

    正如@Alexander 所说,将 android:launchMode="singleTop" 放入活动标签中

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多