Отмена уведомления об удалении приложения из многозадачной панели

Я управляю уведомлением ONGOING из своего приложения (а не из службы).

Когда я удаляю приложение из диспетчера задач с помощью кнопки «Конец», уведомление исчезает .

Когда я удаляю приложение из многозадачной панели, приложение уничтожается, но уведомление остается .

Мои вопросы:

  • Как поймать это событие, чтобы очистить уведомление?
  • Что происходит, когда приложение удаляется из многозадачной панели? Приложение уничтожено, но процесс остается в живых? Это нормально?

Как обновление:

Все мои действия расширяют class MyActivity (который расширяет Activity) с помощью методов:

@Override protected void onCreate(Bundle state) { super.onCreate(state); ((MyApplication) getApplication()).onActivityCreate(this, state); } @Override protected void onDestroy() { super.onDestroy(); ((MyApplication) getApplication()).onActivityDestroy(this); } 

И мое приложение расширяет class MyApplication (который расширяет Application) с помощью методов:

 private List activities = new ArrayList(); protected final void onActivityCreate(Activity activity, Bundle state) { if(activities.isEmpty() && state == null) { onStart(); } activities.add(activity); } protected final void onActivityDestroy(Activity activity) { activities.remove(activity); if(activities.isEmpty() && activity.isFinishing()) { onExit(); } } protected void onStart() { // some code } protected void onExit() { // some code notificationManager.cancel(NOTIFICATION_ID); } 

activities – это список всех текущих видов деятельности

Это не самый простой механизм, но мне это нужно

Должен ли я использовать службу вместо этого?


Как новое обновление:

В моем методе onExit (), если я отлаживаю сообщение Log, чтобы узнать, что происходит следующим образом:

 public void onExit() { for(int i = 0; i < 100; i++) { Log.d(TAG, "onExit"); } } 

небольшое количество журналов появляется один раз на два, не все (например: 13/100)

Итак, я понимаю, что удалить приложение из многозадачной силы pannel, чтобы убить приложение, не дожидаясь закрытых методов, закончить правильно … Но почему бы не обработать?!

Как я могу принудительно закончить?

Killing Notifications, когда основное приложение было убито.

Поскольку ваше уведомление и ваше приложение обрабатываются в разных streamах, убийство вашего приложения через MultitaskManager не приведет к уничтожению вашего уведомления. Поскольку вы уже правильно исследовали убийство своего приложения, это даже не обязательно приведет к обратному вызову onExit ().

Итак, какие решения?

Вы можете запустить сервис из своей деятельности. Специализированные службы: они автоматически перезапускаются автоматически, если по какой-то причине был убит процесс приложения. Поэтому вы можете повторно использовать автоматический перезапуск, убив уведомление при перезапуске.

Шаг 1 создайте службу, которая убивает простой. Он просто убивает уведомление о создании и имеет свой специальный Binder.

 public class KillNotificationsService extends Service { public class KillBinder extends Binder { public final Service service; public KillBinder(Service service) { this.service = service; } } public static int NOTIFICATION_ID = 666; private NotificationManager mNM; private final IBinder mBinder = new KillBinder(this); @Override public IBinder onBind(Intent intent) { return mBinder; } @Override public int onStartCommand(Intent intent, int flags, int startId) { return Service.START_STICKY; } @Override public void onCreate() { mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mNM.cancel(NOTIFICATION_ID); } } 

Шаг 2: Добавьте его в свой манифест: добавьте его где-нибудь между тегами .

  

Шаг 3. Всегда создавайте службу перед тем, как пропустить уведомление, и используйте статическое уведомление.

 ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder binder) { ((KillBinder) binder).service.startService(new Intent( MainActivity.this, KillNotificationsService.class)); Notification notification = new Notification( R.drawable.ic_launcher, "Text", System.currentTimeMillis()); Intent notificationIntent = new Intent(MainActivity.this, Place.class); PendingIntent contentIntent = PendingIntent.getActivity( MainActivity.this, 0, notificationIntent, 0); notification.setLatestEventInfo(getApplicationContext(), "Text", "Text", contentIntent); NotificationManager mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mNM.notify(KillNotificationsService.NOTIFICATION_ID, notification); } public void onServiceDisconnected(ComponentName className) { } }; bindService(new Intent(MainActivity.this, KillNotificationsService.class), mConnection, Context.BIND_AUTO_CREATE); 

Это может занять немного времени, пока служба не будет перезапущена (1-5 секунд), но в конечном итоге она начнет и убьет уведомление.

Возможность прокрутки приложений из последнего списка приложений представлена ​​в Ice Cream Sandwich (API-14).

С той же версией Android мы получили специальный метод «onTaskRemoved ()» в «android.app.Service». Он вызывается, когда приложение удаляется из списка последних приложений.

Поэтому просто переопределите метод onTaskRemoved () для достижения ваших требований, если у вас есть какая-либо работа.

Например:

 @Override public void onTaskRemoved(Intent rootIntent) { NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.cancel(NOTIFICATION_ID); } 

Или просто напишите и запустите специальный сервис, чтобы управлять тем же.

Вы создаете class extends Application и регистрируете обратные вызовы активности, чей вызов при закрытии приложения из многозадачной панели.

  public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle bundle) { } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { } @Override public void onActivityDestroyed(Activity activity) { if (/*check is all your activities onStop state*/) { NotificationManager mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mNM.cancel(R.id.key_notification_id); } } }); } 

}

У меня такая же проблема, но мне удалось ее исправить

Это то, что я сделал

  public class Sample extends Activity { private static final String APP_NOTIFICATION_TAG = "sample"; private static final int NOTIFICATION_ID = 24; private NotificationManager notificationManager; private Notification appNotification; private AppFinishedExecutingListener appFinishedExecutingListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // set the layout and other stuff goes here appFinishedExecutingListener.execute(this); new Thread() { @Override public void run() { try { appFinishedExecutingListener.get(); handler.post(new Runnable() { @Override public void run() { destroyActivityComponent(); } }); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }.start(); setupNotification(); } /* * Setup this app */ private void setupNotification() { Intent intent = new Intent(getApplicationContext(), MainActivity.class); // make sure when the user click the notification, this will make sure it will resume the app intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); // define the action should be performed if the user click the notification ie resume our app activity PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(), (int)System.currentTimeMillis(), intent, 0); // setup the look for this app on a notification panel appNotification = new NotificationCompat.Builder(this) .setContentTitle(getString(R.string.app_name)) .setContentText("Currently listening to kiribati radio") .setSmallIcon(R.drawable.ic_notification_logo) .setContentIntent(pIntent) .setAutoCancel(true) .setOngoing(true).build() ; notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); } /* * Will add app notification when this activity is paused so the user can * quickly access it or resume this activity easily */ private void addAppToNotificationP() { notificationManager.notify(APP_NOTIFICATION_TAG, NOTIFICATION_ID, appNotification); } /* * This will remove the notification if this activity is resumed */ private void removeAppFromNotificationP() { notificationManager.cancel(APP_NOTIFICATION_TAG,NOTIFICATION_ID); } @Override protected void onPause() { super.onPause(); addAppToNotificationP(); } @Override protected void onResume() { super.onResume(); removeAppFromNotificationP(); } private void destroyActivityCompletely() { onResume(); finish(); } } public class AppFinishedExecutingListener extends AsyncTask { private MainActivity main_activity; @Override protected Boolean doInBackground(MainActivity... params) { main_activity = params[0]; while(!main_activity.isFinishing()) { try { Thread.sleep(100); //Log.i(main_activity.TAG,"listening"); } catch (InterruptedException e) { e.printStackTrace(); } } //main_activity.finish(); return true; } } 

Если вы удерживаете кнопку «Дом» в течение 2-3 секунд, мультипанель выходит на передний план, пока наша активность находится в состоянии паузы. Поэтому сначала нужно перенести его на первый план, а затем удалить уведомление о приложении и, наконец, выйти из приложения

Функция destroyActivityCompletely удалит уведомление приложения и затем уничтожит действие. Это будет работать, если активность возбуждается из множества и т. Д.

  • Android Notification Sound
  • Несколько уведомлений о том же действии
  • Уведомления с несколькими линиями в Интернете, такие как приложение Gmail
  • Как использовать Notification.Builder
  • я хочу показать уведомление в 8:00 ежедневно
  • Уведомление о восстановлении задачи, а не конкретной деятельности?
  • возобновление деятельности извещения
  • Как воспроизвести звук уведомления об андроиде
  • Извлечение текста извещных, contentView или contentIntent
  • Отсутствие права на уведомление Push Push
  • Как выполнить метод, нажав на уведомление
  • Interesting Posts

    Выяснение, какое приложение использует веб-камеру

    Объяснение алгоритма Prolog для добавления двух списков вместе

    Создание загрузочного компакт-диска для установки всех драйверов планшетов

    Экзотические архитектуры, о которых заботятся комитеты по стандартам

    Каков рекомендуемый способ создания числового текстового поля в JavaFX?

    Постоянная кнопка входа в расширение Google Hangouts Chrome; Не удалось войти в систему и использовать приложение.

    Дополнение Firefox RestClient говорит Chrome: // restclient / content / how?

    Передает ли объект C ++ в свой собственный конструктор законным?

    Указывает ли спецификация JPA ссылки на столбцы не первичного ключа?

    Настройка насыщенности графики Intel исчезает при использовании HDMI

    Где журналы событий беспроводного соединения Windows 7?

    Где я могу разместить свои учетные данные при использовании Ivy и репозитория частной компании?

    Соглашения об именах PostgreSQL

    Уровеньвыше.

    Завершение сеанса StopWatch с помощью делегата или lambda?

    Давайте будем гением компьютера.