2013-03-22 9 views
16

Sto facendo notifica push nella mia app Android che viene attivata da GCM. Voglio visualizzare la notifica se l'app è in esecuzione in una casella di avviso, se l'app non è in esecuzione significa non in primo piano è sufficiente visualizzare la notifica della barra di stato, come si determina se l'app è in esecuzione ed è in primo piano? questo è possibile mostrare una notifica come this.now sto usando questo codice per mostrare la notifica push barra di statoVisualizza notifica push nella finestra di avviso quando l'applicazione è in esecuzione in primo piano

NotificationManager notificationManager = (NotificationManager) 
       context.getSystemService(Context.NOTIFICATION_SERVICE); 
     Notification notification = new Notification(icon, message, when); 

     String title = context.getString(R.string.app_name); 

     Intent notificationIntent = new Intent(context, BottomActivity.class); 
     // set intent so it does not start a new activity 
     notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 
     notification.setLatestEventInfo(context, title, message, intent); 
     notification.flags |= Notification.FLAG_AUTO_CANCEL; 

     // Play default notification sound 
     notification.defaults |= Notification.DEFAULT_SOUND; 

     //notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "your_sound_file_name.mp3"); 

     // Vibrate if vibrate is enabled 
     notification.defaults |= Notification.DEFAULT_VIBRATE; 
     notificationManager.notify(0, notification); 
+1

Solo per informazioni, se questo è un nuovo progetto che si dovrebbe usare GCM invece di C2DM come è deprecato e Google dicono "C2DM non accetterà nuovi utenti, e concederà nessuna nuova quote " – NickT

+0

ok grazie, userò GCM e andrò a modificare la mia domanda –

+0

@Jithu ho anche bisogno di fare lo stesso in una delle mie app, hai trovato una soluzione adeguata e la mente postare lo stesso qui, sarebbe un grande aiuto Grazie. –

risposta

1

Quante attività hai? Se solo uno, è abbastanza facile mantenere un riferimento singleton ad esso tra onResume() e onPause() (AKA quando è attivo) e chiamare l'attività dal ricevitore, se lo è. se hai molte attività, puoi ottenere una logica simile avendo una classe base comune per loro. Qualcosa del genere:

class MyActivity: Activity 
{ 
    static private MyActivity _Current = null; 

    protected void onResume() //Activated 
    { 
     super.onResume(); 
     _Current = this; 
    } 

    protected void onPause() //Deactivated 
    { 
     super.onPause(); 
     _Current = null; 
    } 

    //This is for the receiver to call 
    static public PopAlert() 
    { 
     if(_Current != null) 
     { 
      new AlertDialog.Builder(_Current) 
       .setMessage("Hello world") 
       //More alert setup; use _Current as a context object 
       .create().show(); 
     } 
    } 
} 
2

È possibile creare una nuova attività e un tema come finestra di dialogo e controllare l'attività in primo piano. Controlla il codice qui sotto.

  ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
     List<RunningTaskInfo> services = activityManager 
       .getRunningTasks(Integer.MAX_VALUE); 
     boolean isActivityFound = false; 

     if (services.get(0).topActivity.getPackageName().toString() 
       .equalsIgnoreCase(context.getPackageName().toString())) { 
      isActivityFound = true; 
     } 

     if (isActivityFound) { 
      resultIntent = new Intent(context, AlertDialogNotification.class); 
      resultIntent.putExtra(EXTRA_ALERT_MESSAGE_BEAUTIFUL, "anyMessage"); 
      resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(resultIntent); 
     } 

Nel file manifest il tema come finestra di dialogo per l'attività. Spero che sia d'aiuto. Facci sapere se hai problemi.

0

riprova questi

public static boolean isAppIsInBackground(Context context) { 

     boolean isInBackground = true; 
     ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); 
     if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) { 
      List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses(); 
      for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) { 
       if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { 
        for (String activeProcess : processInfo.pkgList) { 
         if (activeProcess.equals(context.getPackageName())) 
          isInBackground = false; 
        } 
       } 
      } 
     } else { 
      List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 
      ComponentName componentInfo = taskInfo.get(0).topActivity; 
      if (componentInfo.getPackageName().equals(context.getPackageName())) { 
       isInBackground = false; 
      } 
     }