9

W Androidzie 6.0 Marshmallow Pytam o aplikację na pierwszym planie z następującym kodem, ale wystąpił problem z przychodzącymi powiadomieniami, ponieważ pokazuje ona aplikację na pierwszym planie do aplikacji, która wysyła powiadomienie. Problem występuje tylko w Marshmallow (5.X działa poprawnie).Pierwsze hasło do pakietu aplikacji w Marshmallow opóźnione o 3 sekundy

// 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; 
    } 

, a następnie problem z powiadomieniem jest rozwiązywany za pomocą rozwiązania z tej odpowiedzi UsageEvents.

Jako rozwiązanie w odpowiedzi umieściłem kod i jego działanie, aby uzyskać aplikację na pierwszym planie, ale opóźniono ją o 3 sekundy. Moja usługa sprawdza aplikację na pierwszym planie i powtarza się co 500ms, ale pakiet whatsapp wykrywa po 3 sekundach uruchamiania WhatsApp. to jest kod UsageEvents używam z powyższego rozwiązania.

       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; 

            } 
           } 

Odpowiedz

0

Spróbuj ten kod i upewnij się, że kod zastosować po użytkownik przyznane Runtime Zezwolenie

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; 
} 
Powiązane problemy