9

In Android 6.0 Marshmallow suche ich nach der Vordergrund-App mit dem folgenden Code, aber es gab ein Problem mit eingehenden Benachrichtigungen, da es die App im Vordergrund zur Benachrichtigung zeigt. Das Problem besteht nur in Marshmallow (5.X funktioniert ordnungsgemäß).Vordergrundpaket-Paketname in Marshmallow um 3 Sekunden verzögert

// API 21 and above 
    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public static String getProcessNew(UsageStatsManager mUsageStatsManager, Context c) throws Exception { 
     String st = null; 
     try { 
      long endTime = System.currentTimeMillis(); 
      long beginTime = endTime - 1000 * 10; 

      // We get usage stats for the last minute 
      List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, beginTime, 
        endTime); 
      // Sort the stats by the last time used 
      if (stats != null) { 
       SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>(); 
       for (UsageStats usageStats : stats) { 
        mySortedMap.put(usageStats.getLastTimeUsed(), usageStats); 
       } 
       if (mySortedMap != null && !mySortedMap.isEmpty()) { 
        st = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); 
       } 
      } 

     } catch (Exception e) { 
      Log.d("main", "Wxxxxexx " + e); 

     } 
     return st; 
    } 

und dann Benachrichtigung Problem wird mit Hilfe der Lösung von dieser Antwort UsageEvents gelöst.

Als Lösung in Antwort legte ich den Code und seine Arbeit, um Vordergrund App zu bekommen, aber es um 3 Sekunden verzögert. Mein Dienst überprüft die Vordergrund-App und wiederholt alle 500 ms, aber WhatsApp-Paket erkennt nach 3 Sekunden, WhatsApp zu starten. Dies ist Code von UsageEvents, den ich von oben verwende.

       if (BuildV >= 23) { 
            long endTime = System.currentTimeMillis(); 
            long beginTime = endTime - 1000 * 10; 
            UsageEvents usageEvents = mUsageStatsManager.queryEvents(beginTime, endTime); 
            UsageEvents.Event event = new UsageEvents.Event(); 
            while (usageEvents.hasNextEvent()) { 
             usageEvents.getNextEvent(event); 
            } 
            if (st.equals(event.getPackageName()) 
              && event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) { 
             pack = st; 

            } 
           } 

Antwort

0

Dieser Code Versuchen und sicher Code vornehmen, gelten nach dem Benutzer erteilt Runtime Permission

private RunningAppProcessInfo getForegroundApp() { 
    RunningAppProcessInfo result=null, info=null; 

    if(mActivityManager==null) 
     mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE); 
    List <RunningAppProcessInfo> l = mActivityManager.getRunningAppProcesses(); 
    Iterator <RunningAppProcessInfo> i = l.iterator(); 
    while(i.hasNext()){ 
     info = i.next(); 
     if(info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND 
       && !isRunningService(info.processName)){ 
      result=info; 
      break; 
     } 
    } 
    return result; 
} 

private ComponentName getActivityForApp(RunningAppProcessInfo target){ 
    ComponentName result=null; 
    ActivityManager.RunningTaskInfo info; 

    if(target==null) 
     return null; 

    if(mActivityManager==null) 
     mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE); 
    List <ActivityManager.RunningTaskInfo> l = mActivityManager.getRunningTasks(9999); 
    Iterator <ActivityManager.RunningTaskInfo> i = l.iterator(); 

    while(i.hasNext()){ 
     info=i.next(); 
     if(info.baseActivity.getPackageName().equals(target.processName)){ 
      result=info.topActivity; 
      break; 
     } 
    } 

    return result; 
} 

private boolean isStillActive(RunningAppProcessInfo process, ComponentName activity) 
{ 
    // activity can be null in cases, where one app starts another. for example, astro 
    // starting rock player when a move file was clicked. we dont have an activity then, 
    // but the package exits as soon as back is hit. so we can ignore the activity 
    // in this case 
    if(process==null) 
     return false; 

    RunningAppProcessInfo currentFg=getForegroundApp(); 
    ComponentName currentActivity=getActivityForApp(currentFg); 

    if(currentFg!=null && currentFg.processName.equals(process.processName) && 
      (activity==null || currentActivity.compareTo(activity)==0)) 
     return true; 

    Slog.i(TAG, "isStillActive returns false - CallerProcess: " + process.processName + " CurrentProcess: " 
      + (currentFg==null ? "null" : currentFg.processName) + " CallerActivity:" + (activity==null ? "null" : activity.toString()) 
      + " CurrentActivity: " + (currentActivity==null ? "null" : currentActivity.toString())); 
    return false; 
} 

private boolean isRunningService(String processname){ 
    if(processname==null || processname.isEmpty()) 
     return false; 

    RunningServiceInfo service; 

    if(mActivityManager==null) 
     mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE); 
    List <RunningServiceInfo> l = mActivityManager.getRunningServices(9999); 
    Iterator <RunningServiceInfo> i = l.iterator(); 
    while(i.hasNext()){ 
     service = i.next(); 
     if(service.process.equals(processname)) 
      return true; 
    } 

    return false; 
}