ステータスバーに通知アイコンを表示するアプリケーションを作成しています。ユーザーがステータスバーを開いてアイコンをタップすると、アプリケーションが起動されます。
この起動中にアプリケーションの再作成を回避する方法を探しています。テスト アプリケーションを作成し、ログ メッセージをハンドラー 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);
}
}
FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_CLEAR_TASK 、FLAG_ACTIVITY_NEW_TASKなど、 result_intent に設定できるフラグがいくつかあります。起動時にアクティビティを再開する必要があることを指定できます (アクティビティ起動モード「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)にコメントすることでした