我正在创建在状态栏中显示通知图标的应用程序。当用户打开状态栏并点击图标时,应启动应用程序。
我正在寻找一种方法来避免在此启动期间重新创建应用程序。我创建了测试应用程序并将日志消息添加到处理程序 onCreate、onRestart、onResume、onStop 和 onDestroy。日志消息说明了问题:
- 用户启动应用程序 - onCreate、onResume
- 用户按下 HOME 按钮 - onStop
- 用户打开应用程序列表并再次启动应用程序 - onRestart、onResume
- 用户按下 HOME 按钮 - onStop
- 用户打开最近应用程序列表并选择应用程序 - onRestart、onResume
- 用户按下 HOME 按钮 - onStop
- 用户打开状态栏并点击应用程序图标 - onDestroy、onCreate、onResume。
第 7 步的行为与 3) 和 5) 不同 - 这里有 onDestroy。换句话说,应用程序的实例被重新创建。有可能避免这种娱乐吗?
这是我的测试活动的代码:
public class MainActivity extends Activity {
private final String LOG_TAG = "com.example.notificationtest";
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showNotification(this);
Log.d(LOG_TAG, "NotificationTest: OnCreate");
}
@Override protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "NotificationTest: OnRestart");
}
@Override protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "NotificationTest: OnResume");
}
@Override protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "NotificationTest: OnDestroy");
}
@Override protected void onStop() {
super.onStop();
Log.d(LOG_TAG, "NotificationTest: OnStop");
}
private static final int NOTIF_ID = 91371;
public static void showNotification(Context context) {
final Intent result_intent = new Intent(context, MainActivity.class);
result_intent.setAction(Intent.ACTION_MAIN);
result_intent.addCategory(Intent.CATEGORY_LAUNCHER);
//result_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//result_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
//result_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
TaskStackBuilder stack_builder = TaskStackBuilder.create(context);
stack_builder.addParentStack(MainActivity.class);
stack_builder.addNextIntent(result_intent);
PendingIntent pending_intent = stack_builder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
android.support.v4.app.NotificationCompat.Builder builder = new android.support.v4.app.NotificationCompat.Builder(context);
Resources res = context.getResources();
builder.setContentIntent(pending_intent)
.setSmallIcon(R.drawable.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.ic_launcher))
.setTicker("test")
.setWhen(System.currentTimeMillis())
.setAutoCancel(false)
.setContentTitle("title")
.setContentInfo("cinfo")
.setContentText("ctext");
Notification n = builder.build();
n.flags = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;
NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(NOTIF_ID, n);
}
}
有一些标志可以设置为 result_intent,例如FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_CLEAR_TASK 和FLAG_ACTIVITY_NEW_TASK。它们允许指定应在启动时重新启动活动(使用活动启动模式“singleTop”、“singleTask”等)。但是应该设置什么标志以避免重新启动?也许我应该以某种方式配置pending_intent?
任何帮助将不胜感激。
解决了
非常感谢各位的解答,问题解决了。
这里描述了同样的问题。我已经从该主题检查了测试项目,发现与我的代码不同。为了解决这个问题,我的代码应该按以下方式更改:
final Intent result_intent = new Intent(context, MainActivity.class);
//result_intent.setAction(Intent.ACTION_MAIN); // (1)
//result_intent.addCategory(Intent.CATEGORY_LAUNCHER); // (2)
result_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
另一组标志也有效:
result_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
要点是注释第 (1) 和 (2) 行