2015-07-01 5 views
11

Я работаю над push-уведомлением в android, где я использую метод ниже, чтобы показать уведомление, но проблема в том, что теперь ActivityManager.getRunningTasks (1); устаревает. Из одного вопроса stackoverflow я читал, что: «вы можете использовать getAppTasks(), возвращая List<AppTask>, где вы можете получить RecentTaskInfo с getTaskInfo« но я не могу понять, как его использовать. Пожалуйста, помогите мне здесь в этом отношении.ActivityManager.getRunningTasks устарел android

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()); 
     } 
    } 

ответ

9

Это должно помочь вам начать работу

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

спасибо за ваш ответ здесь. Можете ли вы объяснить мне в соответствии со своим следующим условием, я хочу вставить его, как следующее условие: ActivityManager am = (ActivityManager) ctx.getSystemService (Context.ACTIVITY_SERVICE); \t \t \t \t \t \t \t \t \t \t \t \t Список TaskInfo = am.getRunningTasks (1); \t \t \t \t \t \t ComponentName componentInfo = taskInfo.get (0) .topActivity; –

2

Может вы хотите:

/*** 
* 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(); возвращает только одно приложение, которое работает на нем, оно не отображает все фоновые приложения. я использую android lollipop и выше –

28

Это должно работать на устройствах до Lollipop, а также для 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; 
    } 

Редактировать: он должен возвращать true, если приложение находится в фоновом режиме, а не наоборот

+0

есть ли разрешение, которое нужно добавить в манифест? например 'android.permission.GET_TASKS' или' android.permission.REAL_GET_TASKS' –

+1

Спасибо, что он работает без добавления каких-либо разрешений –