Отправить LocalBroadcast, если активность запущена, иначе отправить уведомление из фоновой службы

Мне нужно обновить свою активность из фоновой службы с помощью LocalBroadcast, если эта активность запущена. Если приложение или действие в настоящее время не запущено, я хотел бы добавить ожидающее уведомление.

Я просмотрел следующие сообщения -

Проверьте, выполняется ли действие из службы

Активность или уведомление через заказную рассылку

У меня есть следующие запросы -

  • Как проверить, запущено ли приложение/активность из фоновой службы?
  • Если я регистрирую и отменяю регистрацию прослушивателя вещания в onPause() и onResume() в своей деятельности, нужно ли мне проверять, выполняется ли активность?
  • Согласно ссылке № 2 выше - If the activity is not on-screen, its receiver will not be registered, so the event will go to the default handler, in the form of your manifest-registered BroadcastReceiver, which will raise the Notification - Как этого добиться, если это возможно?

Если есть другие решения, пожалуйста, поделитесь ими тоже.


person pankaj    schedule 30.10.2015    source источник
comment
регистрация и отмена регистрации слушателя вещания в onPause() и onResume() - хорошее решение, и вы можете зарегистрировать слушателя в своей службе, каждый раз, когда активность переходит в фоновый режим, вызвать зарегистрированного слушателя в службе и установить что-то для добавления ожидающего уведомления   -  person Saeed-rz    schedule 30.10.2015
comment
@Leon_SFS, не могли бы вы уточнить, что вы имеете в виду под registering listener in service   -  person pankaj    schedule 30.10.2015
comment
я имею в виду прослушиватель вещания на вашем сервисе, активность отправляет трансляцию, а служба получает ее и знает, что активность отключена   -  person Saeed-rz    schedule 30.10.2015
comment
Ок, это означает, что всякий раз, когда активность закрывается, мы узнаем статус в Сервисе. Спасибо!   -  person pankaj    schedule 30.10.2015


Ответы (1)


Я столкнулся с той же ситуацией за последнюю неделю. Я нашел лучшее решение, которое может вам помочь.

Чтобы узнать, является ли действие текущим действием в службе

boolean isNotificationRequired = true;
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
Log.d("TEST", "CURRENT Activity ::" + taskInfo.get(0).topActivity.getClassName());
ComponentName componentInfo = taskInfo.get(0).topActivity;
componentInfo.getPackageName();

Добавить в файл манифеста

<uses-permission android:name="android.permission.GET_TASKS" />

Теперь выполните операцию, если действие является текущим выполняемым действием.

if(taskInfo.get(0).topActivity.getClassName().equals(YOUR_CURRENT_ACTIVITY.class.getName())
{
     //Perform the Operations
     isNotificationRequired = false;
}

Теперь отправляйте уведомление только в том случае, если isNotificationRequired имеет значение true.

if(isNotificationRequired){
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                this).setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("Notification Title")
                .setContentText("Notification Message");
        PendingIntent notifyIntent = PendingIntent.getActivity(this, requestcode,
                resultIntent, PendingIntent.FLAG_ONE_SHOT);
        mBuilder.setContentIntent(notifyIntent);
        mBuilder.setAutoCancel(true);
        mBuilder.setDefaults(Notification.DEFAULT_VIBRATE
                | Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS);
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        mNotificationManager.notify(requestcode, mBuilder.build());    
}

В противном случае отправьте трансляцию и обновите свою активность.

(Для меня, если я отправлю существующее намерение, оно не будет получено должным образом в получателе. Поэтому я создал новое намерение и передал данные существующего намерения в putExtras() этого newIntent.)

else {
            Log.i("TEST", "Sending broadcast to activity");
            Intent newIntent = new Intent();
            newIntent.setAction("TestAction");
            sendBroadcast(newIntent);
     }

Затем в своей деятельности обработайте трансляцию, создав широковещательный приемник. Не забудьте создать экземпляр. Не нужно упоминать получателя в manifest.xml.

public class YourCurrentRunningActivity extends Activity {
    YourBroadcastReceiver receiver = new YourBroadcastReceiver();

    protected void onCreate(Bundle savedInstanceState) {
    (this).registerReceiver(receiver, new IntentFilter("TestAction"));

     public class YourBroadcastReceiver extends BroadcastReceiver {

         @Override
         public void onReceive(Context arg0, Intent arg1) {
              // Perform the Actions u want.
         }
     }
}

Затем вы можете отменить регистрацию приемника в onStop()/onPause()/onDestroy() следующим образом:

this.unregisterReceiver(receiver);
person Geetha    schedule 30.10.2015
comment
Спасибо ! Недостатком этого подхода является то, что - Использование ActivityManager не рекомендуется - As of LOLLIPOP, this method is no longer available to third party applications: the introduction of document-centric recents means it can leak person information to the caller. For backwards compatibility, it will still return a small subset of its data: at least the caller's own tasks, and possibly some other tasks such as home that are known to not be sensitive - person pankaj; 30.10.2015
comment
Я, наконец, согласился с вашим предложением, за исключением проверки активности. - person pankaj; 03.11.2015
comment
Рад слышать. Не могли бы вы рассказать мне, как вы находите текущую активность без использования ActivityManager? - person Geetha; 03.11.2015
comment
Как упоминалось в комментариях выше, вы можете использовать другой широковещательный приемник, который запускается в onPause() вашей активности, и вы можете получить эту информацию в своем сервисе. Есть еще один способ, который может не быть рекомендуемой практикой - вы можете иметь статическую переменную в своей деятельности и устанавливать/сбрасывать ее в onPause() и onResume() ; вы можете прочитать эту переменную в своем сервисе. - person pankaj; 03.11.2015