上下文:有一个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"
)。他们似乎都没有做到这一点。
答案 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 ..)