2015-01-21 6 views
21

मैं एक ऐप लॉक एप्लिकेशन बना रहा हूं, lollipop.getRunningTaskinfo विधि में वर्तमान चल रहे कार्य को कैसे लॉलीपॉप एपीआई में हटा दिया गया है, फिर समस्या को कैसे खत्म किया जाए।लॉलीपॉप में टोपएक्टिविटी नाम कैसे प्राप्त करें या वर्तमान चल रहे एप्लिकेशन पैकेज का नाम प्राप्त करें?

+0

आप घटनाओं (नहीं उपयोग के आँकड़े) के लिए क्वेरी करने के लिए इस्तेमाल कर सकते हैं UsageStatsManager उपयोग सेवा है के बारे में अधिक जानकारी प्राप्त कर सकते है, लेकिन प्रति प्रलेखन के रूप में, पिछले मिनट (वास्तव में सेकंड) को काट रहे हैं गैर-सिस्टम अनुप्रयोगों को यह जानने के लिए रोकें कि वर्तमान में कौन सा एप्लिकेशन चल रहा है। –

उत्तर

29

इस प्रयास करें:

ActivityManager mActivityManager =(ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE); 

if(Build.VERSION.SDK_INT > 20){ 
String mPackageName = mActivityManager.getRunningAppProcesses().get(0).processName; 
} 
else{ 
    String mpackageName = mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName(); 
} 

हम UsageStats का उपयोग कर प्राप्त कर सकते हैं:

public static String getTopAppName(Context context) { 
    ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    String strName = ""; 
    try { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      strName = getLollipopFGAppPackageName(context); 
     } else { 
      strName = mActivityManager.getRunningTasks(1).get(0).topActivity.getClassName(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return strName; 
} 


private static String getLollipopFGAppPackageName(Context ctx) { 

    try { 
     UsageStatsManager usageStatsManager = (UsageStatsManager) ctx.getSystemService("usagestats"); 
     long milliSecs = 60 * 1000; 
     Date date = new Date(); 
     List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, date.getTime() - milliSecs, date.getTime()); 
     if (queryUsageStats.size() > 0) { 
      Log.i("LPU", "queryUsageStats size: " + queryUsageStats.size()); 
     } 
     long recentTime = 0; 
     String recentPkg = ""; 
     for (int i = 0; i < queryUsageStats.size(); i++) { 
      UsageStats stats = queryUsageStats.get(i); 
      if (i == 0 && !"org.pervacio.pvadiag".equals(stats.getPackageName())) { 
       Log.i("LPU", "PackageName: " + stats.getPackageName() + " " + stats.getLastTimeStamp()); 
      } 
      if (stats.getLastTimeStamp() > recentTime) { 
       recentTime = stats.getLastTimeStamp(); 
       recentPkg = stats.getPackageName(); 
      } 
     } 
     return recentPkg; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return ""; 
} 

// USAGE_STATS सक्षम करने के लिए

// Declare USAGE_STATS permisssion in manifest 

    <uses-permission 
    android:name="android.permission.PACKAGE_USAGE_STATS" 
    tools:ignore="ProtectedPermissions" /> 


    Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); 
    startActivity(intent); 
+0

यह पैकेज नाम के बजाय प्रक्रिया का नाम देता है। वे कभी-कभी अलग होते हैं। – Sam

+0

यह एपीआई 20- के लिए शीर्ष गतिविधि की बजाय मूल गतिविधि का उपयोग करने लगता है। क्या यह शीर्ष गतिविधि नहीं होनी चाहिए? – Sam

+1

मुझे लगता है कि यह एप्लिकेशन बेस पैकेज नाम देता है। – WenChao

0

इस तरह से प्राप्त किया जा सकता है .....

ActivityManager am =(ActivityManager)context.getSystemService(ACTIVITY_SERVICE); 
List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1); 
ActivityManager.RunningTaskInfo task = tasks.get(0); // current task 
ComponentName rootActivity = task.baseActivity; 


rootActivity.getPackageName();//*currently active applications package name* 
,210

लॉलीपॉप के लिए:

ActivityManager mActivityManager =(ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE); 

if(Build.VERSION.SDK_INT > 20){ 
    String activityName =mActivityManager.getRunningAppProcesses().get(0).processName; 
} 
else{ 
String activityName = mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName(); 
} 

पूरा उदाहरण के लिए check this out...

+0

'getRunningTasks' एंड्रॉइड 5 में कुछ कार्यों के लिए काम नहीं करता है। – Sam

+0

[getRunningAppProcesses] (https://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses()) केवल एक चेतावनी के साथ आता है इसका उपयोग करते समय डीबग मोड – Clocker

+0

@ एसएएम ने मेरा जवाब संपादित किया। –

4

आपको यकीन है? जैसा कि मैं नवीनतम एंड्रॉइड दस्तावेज़ों के अनुसार देख सकता हूं, लॉलीपॉप अपडेट आपको अपने ऐप्स की तुलना में अन्य ऐप्स के बारे में कोई जानकारी नहीं देता है !?

http://developer.android.com/reference/android/app/ActivityManager.html आप देख सकते हैं कि उन सभी विधियों को हटा दिया गया है!

1

इसे आज़माएं .. यह मेरे लिए काम करता है।

ActivityManager activityManager = (ActivityManager) getSystemService (Context.ACTIVITY_SERVICE); 

if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP)  
{ 

String packageName = activityManager.getRunningAppProcesses().get(0).processName; 
} 
else if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) 
{ 
String packageName = ProcessManager.getRunningForegroundApps(getApplicationContext()).get(0).getPackageName(); 

} 
else 
{ 
String packageName = activityManager.getRunningTasks(1).get(0).topActivity.getPackageName(); 
} 
+3

पर काम नहीं कर रहा है ProcessManager क्या है? –

+0

ध्यान दें कि '.processName' हमेशा प्रक्रिया का पैकेज नाम नहीं होगा। – Sam

+2

मैंने अभी एक त्वरित Google खोज की है, और 'ProcessManager' ['AndroidProcesses'] (https://github.com/jaredrummler/AndroidProcesses) लाइब्रेरी में एक बहिष्कृत वर्ग प्रतीत होता है। – Sam

2

एपीआई 21 या ऊपर में रनिंग ऐप पाने का सबसे अच्छा समाधान नीचे आज़माएं। मुझे

private String retriveNewApp() { 
    if (VERSION.SDK_INT >= 21) { 
     String currentApp = null; 
     UsageStatsManager usm = (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE); 
     long time = System.currentTimeMillis(); 
     List<UsageStats> applist = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time); 
     if (applist != null && applist.size() > 0) { 
      SortedMap<Long, UsageStats> mySortedMap = new TreeMap<>(); 
      for (UsageStats usageStats : applist) { 
       mySortedMap.put(usageStats.getLastTimeUsed(), usageStats); 
      } 
      if (mySortedMap != null && !mySortedMap.isEmpty()) { 
       currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); 
      } 
     } 
     Log.e(TAG, "Current App in foreground is: " + currentApp); 

     return currentApp; 

    } 
    else { 

     ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
     String mm=(manager.getRunningTasks(1).get(0)).topActivity.getPackageName(); 
     Log.e(TAG, "Current App in foreground is: " + mm); 
     return mm; 
    } 
} 
+0

एसडीके_INटी> = 21 मामले के बारे में, किस ऐप्स में उनकी प्रक्रियाएं अभी भी जिंदा हैं? –

+0

काम नहीं कर रहा है शून्य –

-2

के लिए यह काम मैं शीर्ष गतिविधि नाम होने का एक hacky तरह से इस्तेमाल करते हैं। जब भी मैं किसी गतिविधि को बना या फिर से शुरू करता हूं, तो मैं नाम साझाकरण में सहेजता हूं। मैंने सहेजे गए और SharePreferences से शीर्ष क्लास प्राप्त करने के लिए दो फ़ंक्शन बनाए हैं। यह हमेशा अंतिम गतिविधि को ओवरराइट करता है और शीर्ष गतिविधि देता है। मुझे अनुमतियों और API स्तरों के बारे में चिंता करने की ज़रूरत नहीं है। बहुत सरल लेकिन निश्चित रूप से ऐसा करने का सबसे अच्छा तरीका नहीं है।

+1

क्षमा करें, लेकिन सवाल उन ऐप्स के बारे में पूछता है जो आपके पैकेज के नाम के समान नहीं हैं – Penn

2

वर्तमान रनिंग ऐप प्राप्त करने के लिए आप AccessibilityService का उपयोग कर सकते हैं। अभिगम्यता सेवा ऑनएक्सेबिलिटीवेंट ईवेंट प्रदान करती है।

कुछ नमूना कोड निम्नलिखित है।

@Override 
    public void onAccessibilityEvent(AccessibilityEvent event) { 
     if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { 
      if (event.getPackageName() != null && event.getClassName() != null) { 
       Log.d("Foreground App", event.getPackageName().toString()); 

      } 
     } 
    } 

आप here

संबंधित मुद्दे