2014-09-02 2 views
2

Мне нужно запустить приложение при получении уведомления. Следующий фрагмент кода отлично работает, когда приложение убито и получено уведомление (т. Е. Код внутри if). Но когда приложение работает на переднем плане или в фоновом режиме, создается несколько экземпляров активности (например, фрагмент в другом состоянии). Это не MainActivity, который должен быть запущен при получении уведомления, вместо этого это другое действие, содержащее широковещательный приемник. Я добавил следующие строки в поле onMessage класса GCMintentService.Открытая активность Android при получении уведомления

if (currentPackage.equalsIgnoreCase(context.getPackageName() 
       .toString())) { 
      broadcastMessage(context, message); 
     } else { 
      Intent mIntent = new Intent(context, MainActivity.class); 
      mIntent.setAction(Intent.ACTION_MAIN); 
      mIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
      mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(mIntent); 
     } 

В своей деятельности, при OnReceive методом BroadcastReceiver, я начинаю свою деятельность снова.

private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     startActivity(getIntent().setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)); 
    } 
}; 

ответ

0

У меня также было это требование в одном из моих приложений. Мы можем добиться этого, если мы называем

Intent mIntent = new Intent(context, MainActivity.class); 
       mIntent.setAction(Intent.ACTION_MAIN); 
       mIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
       mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       context.startActivity(mIntent); 
broadcastMessage(context, message); 

В основной деятельности используют следующие в вещательном приемнике, который будет получать широковещательное сообщение выше.

WakeLock wakeLock = null; 
     KeyguardManager kgMgr = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
     boolean locked = kgMgr.inKeyguardRestrictedInputMode(); 
     PowerManager pm = (PowerManager) context 
       .getSystemService(Context.POWER_SERVICE); 
     if (!pm.isScreenOn()) { 
      wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK 
        | PowerManager.ACQUIRE_CAUSES_WAKEUP, "MyWakeLock"); 
      wakeLock.acquire(); 
     } 
     if (locked) { 
      Window mWindow = getWindow(); 
      mWindow.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
      mWindow.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
     } 

Лично я считаю, что это не самый лучший из ответов, а также лучшие идеи, чтобы открыть приложение непосредственно при получении уведомления, как будет много функций, таких как OnCreate onResume, будет срабатывать автоматически, испортит пользователи работают, если они находятся в действительно важной работе, открывая другое приложение напрямую, также нам нужно поместить много флагов или использовать любой другой метод для управления потоком приложения, когда пользователь открывает приложение, приложение происходит из фона, приложение открыло соответствующее уведомление и все такие случаи. Избегайте этого, поскольку это портит весь пользовательский опыт.

Смежные вопросы