2015-07-01 16 views
11

Pracuję nad powiadomieniem push w Androidzie, gdzie używam poniższej metody do wyświetlania powiadomień, ale problem polega na tym, że teraz ActivityManager.getRunningTasks (1); jest przestarzałe. Od jednego pytania stackoverflow czytałem, że: "możesz użyć getAppTasks() zwrócenie gdzie można uzyskać RecentTaskInfo z getTaskInfo", ale nie mogę go znaleźć, jak z niego korzystać. Proszę, pomóżcie mi tutaj w tym względzie.ActivityManager.getRunningTasks jest przestarzałym Androidem

private void postNotification(Context ctx, Intent intent) { 
     try { 
      if (intent == null) { 
       Log.d(TAG, "Receiver intent null"); 
      } else { 
       String action = intent.getAction(); 
       if (action.equals("com.ziza.cy.UPDATE_STATUS")) { 

        JSONObject json = new JSONObject(intent.getExtras() 
          .getString("com.parse.Data")); 

        String type = json.getString("type"); 

        if (type.equals("AlertNotification")) { 

         String msg = json.getString("header"); 
         String title = "ncy"; 

         ActivityManager am = (ActivityManager) ctx 
           .getSystemService(Context.ACTIVITY_SERVICE); 
         List<RunningTaskInfo> taskInfo = am.getRunningTasks(1); 
         ComponentName componentInfo = taskInfo.get(0).topActivity; 

         // don't show notification if app is in foreground 
         if (componentInfo.getPackageName().equalsIgnoreCase(
           ctx.getPackageName())) { 

          // send broadcast receiver 
          Intent intentBroad = new Intent(); 
          intentBroad.setAction(Constants.sNOTIFICATION); 
          intentBroad.putExtra("msg", msg); 
          intentBroad.putExtra("title", title 
            + " " 
            + taskInfo.get(0).topActivity.getClass() 
              .getSimpleName()); 
          ctx.sendBroadcast(intentBroad); 
         } else { 
          // Activity Not Running 
          // Generate Notification 

          Intent intnt = new Intent(ctx, LogInActivity.class); 
          PendingIntent contentIntent = PendingIntent 
            .getActivity(ctx, 0, intnt, 0); 
          intnt.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
            | Intent.FLAG_ACTIVITY_NEW_TASK); 

          NotificationCompat.Builder builder = new NotificationCompat.Builder(
            ctx) 
            .setContentTitle(title) 
            .setContentText(msg) 
            .setTicker(msg) 
            .setSound(
              RingtoneManager 
                .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) 
            .setStyle(
              new NotificationCompat.BigTextStyle() 
                .bigText(msg)) 
            .setAutoCancel(true) 
            .setSmallIcon(R.drawable.iconed) 
            .setOnlyAlertOnce(true) 
            .setDefaults(Notification.DEFAULT_VIBRATE); 

          Uri alarmSound = RingtoneManager 
            .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
          builder.setSound(alarmSound); 
          builder.setContentIntent(contentIntent); 
          NotificationManager notificationManager = (NotificationManager) ctx 
            .getSystemService(Context.NOTIFICATION_SERVICE); 

          notificationManager.notify(0, builder.build()); 

         } 
        } 
       } 
      } 

     } catch (JSONException e) { 
      Log.d(TAG, "JSONException: " + e.getMessage()); 
     } 
    } 

Odpowiedz

9

To powinno pomóc w rozpoczęciu

ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
List<ActivityManager.AppTask> tasks = activityManager.getAppTasks(); 

for (ActivityManager.AppTask task : tasks) { 
    Log.d(TAG, "stackId: " + task.getTaskInfo().stackId); 
} 
+2

dzięki za odpowiedź tutaj. Czy możesz mi wyjaśnić zgodnie z moim poniższym warunkiem, chcę osadzić go jak następujący warunek: ActivityManager am = (ActivityManager) ctx.getSystemService (Context.ACTIVITY_SERVICE); \t \t \t \t \t \t \t \t \t \t \t \t Lista TaskInfo = am.getRunningTasks (1); \t \t \t \t \t \t Nazwa składnika componentInfo = taskInfo.get (0) .topActivity; –

2

Może chcesz to:

/*** 
* Checking Whether any Activity of Application is running or not 
* @param context 
* @return 
*/ 
public static boolean isForeground(Context context) { 

    // Get the Activity Manager 
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 

    // Get a list of running tasks, we are only interested in the last one, 
    // the top most so we give a 1 as parameter so we only get the topmost. 
    List<ActivityManager.RunningAppProcessInfo> task = manager.getRunningAppProcesses(); 

    // Get the info we need for comparison. 
    ComponentName componentInfo = task.get(0).importanceReasonComponent; 

    // Check if it matches our package name. 
    if(componentInfo.getPackageName().equals(context.getPackageName())) 
     return true; 

    // If not then our app is not on the foreground. 
    return false; 
} 
+0

getRunningAppProcesses(); zwraca tylko jedną aplikację, która działa sama, nie pokazuje wszystkich aplikacji działających w tle. używam Android Lollipop i powyżej –

28

To powinno działać na pre urządzeń Lollipop jak również dla urządzeń Lollipop

public static boolean isBackgroundRunning(Context context) { 
     ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
     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())) { 
         //If your app is the process in foreground, then it's not in running in background 
         return false; 
        } 
       } 
      } 
     } 


     return true; 
    } 

Edytuj: Powinna zwrócić wartość true, jeśli aplikacja działa w tle, a nie odwrotnie:

+0

czy istnieje potrzeba pozwolenia na dodanie Manifestu? jak 'android.permission.GET_TASKS' lub' android.permission.REAL_GET_TASKS' –

+1

Dziękujemy, że działa bez dodawania żadnych uprawnień –