无法在点击通知时恢复活动状态

时间:2015-10-04 13:30:14

标签: android android-intent

上下文:有一个toggleButton可以在'Record'和'Stop'之间切换。单击记录时,会创建一个通知,告诉用户正在运行后台服务,即使用户已按下主页按钮等并移出应用程序。点击通知后,用户应该可以参加活动并“停止”录制并保存文件。

问题:如果我点击记录(并因此切换按钮),然后点击主页按钮,然后点击通知,它来到活动,但是toggleButton在'记录'而不是'停止'。即它没有保留以前的状态。我认为这是因为创建了一个新的活动实例而不是重用现有实例。

代码:

    public void showRecordingNotification(){
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
        mBuilder.setSmallIcon(R.mipmap.ic_launcher);
        mBuilder.setContentTitle("Recording in progress!");
        mBuilder.setContentText("Go to the app to stop.");
        Intent notificationIntent = new Intent(this, MainActivity.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

        PendingIntent appPendingIntent=PendingIntent.getActivity(this,0,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(appPendingIntent);
        Notification notification= mBuilder.build();
        notification.flags = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;

        mNotificationManager.notify(NOTIFICATION_ID, notification);
    }

android清单:

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

    <uses-feature
        android:name="android.hardware.sensor.accelerometer"
        android:required="true" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name">
        <service android:name=".DataLogger"/>
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTask"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ReplayActivity"
            android:label="@string/title_activity_replay"
            android:parentActivityName=".MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="space.wavicle.sensorvector2d.MainActivity" />
        </activity>
    </application>

</manifest>

我尝试了什么:围绕SO搜索,我发现很多人都有类似的声音问题,而且所有解决方案似乎围绕着意图的标志,其中我尝试了所有的有意义的组合。我在清单中也有android:launchMode="singleTask"(也尝试了android:launchMode="singleInstance")。他们似乎都没有做到这一点。

1 个答案:

答案 0 :(得分:4)

在我看来,你应该问自己一个不同的问题。

为什么这个按钮很重要,如果活动是新实例?

你究竟如何知道你的录音状态?如果你在活动中保存状态,这意味着如果活动以某种方式丢失(崩溃)或被杀死,你将失去你的状态。那很糟糕。

你说你有一个在后台运行的服务,我会让服务保持我的状态。

编辑:

关于实例问题,首先,这里是google文档的链接,以便您可以进一步了解该主题:

http://developer.android.com/guide/components/tasks-and-back-stack.html#ManifestForTasks

总之,有4个launchModes状态,标准,singleTop,singleTask,singleInstance。 你可以阅读文档中的差异。

我看到它的方式我会建议你选择“singleTask”状态。

基本上,在singleTask中,如果你通过例如通知再次打开该活动,它将恢复已经打开的当前活动,你可以调试它并看到你不会进入通常的onCreate,你会去通过onResume(和OnNewIntent ofc ..)