2014-12-29 5 views
13

मैं एंड्रॉइड में वर्तमान चल रहे गतिविधि नाम प्राप्त करने के लिए निम्न कोड का उपयोग कर रहा हूं।एंड्रॉइड 5.0 (एल) में चल रहे एप्लिकेशन गतिविधि का नाम कैसे प्राप्त करें?

ActivityManager am = (ActivityManager) aContext 
       .getSystemService(Context.ACTIVITY_SERVICE);    
List<ActivityManager.RunningTaskInfo> alltasks = am 
       .getRunningTasks(1); 

ComponentName componentInfo = alltasks.get(0).topActivity; 
componentInfo.getClassName(); 

System.out.println("Current:"+componentInfo.getClassName()); 

यह एंड्रॉइड 5.0 के नीचे सभी संस्करणों में ठीक काम कर रहा है। लेकिन एंड्रॉइड 5.0 में यह हमेशा लॉन्चर गतिविधि लौटा रहा है।

कृपया कोई भी इस में सहायता करें क्योंकि मैं सभी एंड्रॉइड संस्करणों में एप्लिकेशन को चलाने के लिए चाहता हूं।

+0

मेरे लिए यह 5.0 नीचे संस्करण के लिए ठीक से काम नहीं करता और java.lang.SecurityException को जन्म देती है। यहां देखें- http://stackoverflow.com/questions/30350328/global-class-to-register-listeners-for-all-the-activities-in-android। कृपया – inquisitive

+0

सभी को उत्तर देने के लिए, मैं उस धागे को पढ़ने की सलाह देता हूं: http://stackoverflow.com/questions/30619349/android-5-1-1-and-above-getrunningappprocesses-returns-my-plication-packag – JacksOnF1re

+0

इसे आजमाएं: https://stackoverflow.com/questions/28066231/how-to-gettopactivity-name-or-get-current-running-application-package-name-in-lo – Mostafa

उत्तर

14

एंड्रॉइड एल से पहले आपका कोड काम करेगा, लेकिन एंड्रॉइड एल ऑनवर्ड getRunningTask से काम नहीं करेगा। आपको getAppRunningProcess का उपयोग करना होगा।

चेक इस कोड के नीचे -

public class DetectCalendarLaunchRunnable implements Runnable { 

@Override 
public void run() { 
    String[] activePackages; 
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) { 
    activePackages = getActivePackages(); 
    } else { 
    activePackages = getActivePackagesCompat(); 
    } 
    if (activePackages != null) { 
    for (String activePackage : activePackages) { 
     if (activePackage.equals("com.google.android.calendar")) { 
     //Calendar app is launched, do something 
     } 
    } 
    } 
    mHandler.postDelayed(this, 1000); 
} 

String[] getActivePackagesCompat() { 
    final List<ActivityManager.RunningTaskInfo> taskInfo = mActivityManager.getRunningTasks(1); 
    final ComponentName componentName = taskInfo.get(0).topActivity; 
    final String[] activePackages = new String[1]; 
    activePackages[0] = componentName.getPackageName(); 
    return activePackages; 
} 

String[] getActivePackages() { 
    final Set<String> activePackages = new HashSet<String>(); 
    final List<ActivityManager.RunningAppProcessInfo> processInfos = mActivityManager.getRunningAppProcesses(); 
    for (ActivityManager.RunningAppProcessInfo processInfo : processInfos) { 
    if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { 
     activePackages.addAll(Arrays.asList(processInfo.pkgList)); 
    } 
    } 
    return activePackages.toArray(new String[activePackages.size()]); 
} 
} 

आशा इसकी सहायता से आप

+0

ठीक काम किया। तुम मेरे जीवनकाल हो। बहुत बहुत धन्यवाद @ आशीष तमकार – Krishna

+0

@ कृष्ण - आपका स्वागत है :) –

+1

@ आशीषम्रामकर, यहां गतिविधि प्रबंधक का उपयोग करके। RunningAppProcessInfo calss हमें केवल पैकेज नाम मिल रहे हैं लेकिन गतिविधि नामों के साथ नहीं। तो सवाल के अनुसार जवाब बदलें। –

0

:) कृपया link की जाँच करें।

दुर्भाग्यवश, एंड्रॉइड 5.0 में कोई समकक्ष नहीं है: शीर्ष गतिविधि प्राप्त करना संभव नहीं है, और न ही किसी भी कॉलबैक को संभव है जब रीयलटाइम में कोई नया एप्लिकेशन/गतिविधि लॉन्च हो।

methods deplicated in 5.0

+0

ठीक है, आपका लिंक वास्तव में उत्तर प्रदान करता है? तो "यह संभव नहीं है" बस सच नहीं है। इसका और अधिक: "पर निर्भर करता है .."। – JacksOnF1re

2

आप इस का उपयोग कर सकते हैं:

String packageName = ""; 
String className = ""; 

UsageStatsManager usageStatsManager = (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE); 

if (usageStatsManager != null) 
{ 
    UsageEvents queryEvents = usageStatsManager.queryEvents(System.currentTimeMillis() - 10000, System.currentTimeMillis()); 

    if (queryEvents != null) 
    { 
     UsageEvents.Event event = new UsageEvents.Event(); 

     while (queryEvents.hasNextEvent()) 
     { 
      UsageEvents.Event eventAux = new UsageEvents.Event(); 
      queryEvents2.getNextEvent(eventAux); 

      if (eventAux.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) 
      { 
       event = eventAux; 
      } 
     } 

     packageName = event.getPackageName(); 
     className = event.getClassName(); 
    } 
} 

आप जो एक सिस्टम स्तर अनुमति है और तृतीय पक्ष एप्लिकेशन को नहीं दिए जाएंगे android.permission.PACKAGE_USAGE_STATS की जरूरत है,। हालांकि, अनुमति घोषित करने से एपीआई का उपयोग करने का इरादा है और डिवाइस के उपयोगकर्ता सेटिंग एप्लिकेशन के माध्यम से अनुमति दे सकते हैं।

या आप कर सकते हैं:

pm grant com.your.package android.permission.PACKAGE_USAGE_STATS 
संबंधित मुद्दे