दिलचस्प पोस्ट
एक स्ट्रिंग में चर बदलने JQuery के बिना JQuery के एक JSONP अनुरोध कैसे करें? डेटा फ्रेम से पंक्ति नामों का प्रदर्शन हटाया जा रहा है मानक स्ट्रीम (पब्बिनेट) द्वारा प्रयुक्त आंतरिक बफ़र सेट करना <Select> jquery के साथ विकल्प बदलने के लिए कैसे? आप अपने नाम को वापस करने के लिए रेंज कैसे प्राप्त कर सकते हैं? हैशसेट / हैशमैप के लिए डुप्लिकेट मान को पिछले मान को बदलना असफल भविष्य की सुविधा (__future__) पुराने ढंग से अनुवादित संस्करण के कारण आयात से कैसे सुव्यवस्थित हो? कैसे jquery का उपयोग कर AJAX कॉल श्रृंखला चेन करने के लिए WhatsApp लिंक साझा करने के लिए एक छवि प्रदान करें दो उपयोगकर्ताओं के बीच सामाजिक दूरी की गणना करें जावा प्रोग्राम्स की मेमोरी सेट करना जो कि एक्लिप्स से चलता है एक सीमावर्ती रूप चलने योग्य बनाओ? क्या पॉपअपमेनू में आइकन प्रदर्शित करना संभव है? एंड्रॉइड – इनकमिंग एसएमएस संदेशों के लिए सुनो

एंड्रॉइड: वर्तमान फ़ोरोग्राफ़ गतिविधि (सेवा से) कैसे प्राप्त कर सकता हूं?

क्या सेवा से वर्तमान में चल रहे गतिविधि का संदर्भ पाने के लिए कोई देशी एंड्रॉइड तरीका है?

मेरे पास पृष्ठभूमि पर एक सेवा चल रही है, और जब कोई घटना होती है (सेवा में) मैं अपनी मौजूदा गतिविधि को अपडेट करना चाहूंगा। क्या ऐसा करने का एक आसान तरीका है (जैसा मैंने ऊपर सुझाव दिया था)?

Solutions Collecting From Web of "एंड्रॉइड: वर्तमान फ़ोरोग्राफ़ गतिविधि (सेवा से) कैसे प्राप्त कर सकता हूं?"

क्या सेवा से वर्तमान में चल रहे गतिविधि का संदर्भ पाने के लिए कोई देशी एंड्रॉइड तरीका है?

हो सकता है कि आप "वर्तमान चल रहे गतिविधि" का स्वामी न हों

मेरे पास पृष्ठभूमि पर एक सेवा चल रही है, और जब कोई घटना होती है (सेवा में) मैं अपनी मौजूदा गतिविधि को अपडेट करना चाहूंगा। क्या ऐसा करने का एक आसान तरीका है (जैसा मैंने ऊपर सुझाव दिया था)?

  1. गतिविधि के लिए एक प्रसारण Intent भेजें – यहाँ एक नमूना प्रोजेक्ट है जो इस पैटर्न का प्रदर्शन करता है
  2. गतिविधि को एक PendingIntent (जैसे, createPendingResult() माध्यम से) कि सेवा invokes
  3. गतिविधि को कॉलबैक या श्रोता वस्तु को सेवा के साथ bindService() माध्यम से bindService() , और उस कॉलबैक / श्रोता ऑब्जेक्ट पर एक सेवा पद्धति कॉल करते हैं
  4. एक अनुक्रमित प्रसारण भेजें बैकअप के रूप में कम-प्राथमिकता BroadcastReceiver रिसीवर (गतिविधि को ऑन-स्क्रीन नहीं है, तो एक Notification बढ़ाने के लिए) गतिविधि के Intent से भेजें – यहां इस पैटर्न पर अधिक के साथ एक ब्लॉग पोस्ट है

गतिविधि प्रबंधक का उपयोग करके यह करने का एक अच्छा तरीका है आप मूल रूप से गतिविधि प्रबंधक से रनिंग टास्क प्राप्त करें। यह हमेशा वर्तमान में सक्रिय कार्य को पहले वापस देगा वहां से आप शीर्ष गतिविधि प्राप्त कर सकते हैं।

यहाँ उदाहरण

ActivityManager सेवा से चल रहे कार्यों की सूची प्राप्त करने का एक आसान तरीका है आप फोन पर चलने वाले कार्यों की अधिकतम संख्या का अनुरोध कर सकते हैं, और डिफ़ॉल्ट रूप से, वर्तमान में सक्रिय कार्य को पहले लौटाया गया है।

आपके पास एक बार जब आप अपनी सूची से शीर्ष गतिविधि का अनुरोध करके एक घटक नाम ऑब्जेक्ट प्राप्त कर सकते हैं।

यहाँ एक उदाहरण है

  ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); Log.d("topActivity", "CURRENT Activity ::" + taskInfo.get(0).topActivity.getClassName()); ComponentName componentInfo = taskInfo.get(0).topActivity; componentInfo.getPackageName(); 

आपको अपने मैनिफेस्ट पर निम्नलिखित अनुमति की आवश्यकता होगी:

 <uses-permission android:name="android.permission.GET_TASKS"/> 

चेतावनी: Google Play उल्लंघन

इस तकनीक का उपयोग करने से आपका ऐप Google Play से निकाला जा सकता है । Google ने हाल ही में मुझसे कहा कि मेरे ऐप को अपडेट करने के लिए क्योंकि यह एक अभिगम्यता सेवा का दुरुपयोग है मैंने दस्तावेजों की जांच की और पुष्टि की कि यह मामला है:

एक्सेस करने योग्य सेवाओं का उपयोग केवल एंड्रॉइड डिवाइसों और ऐप्स का उपयोग करने में विकलांग लोगों को सहायता के लिए किया जाना चाहिए।


एक AccessibilityService उपयोग करें

  • आप एक AccessibilityService का उपयोग करके वर्तमान में सक्रिय विंडो का पता लगा सकते हैं
  • onAccessibilityEvent TYPE_WINDOW_STATE_CHANGED ईवेंट कॉलबैक में, जब वर्तमान विंडो में परिवर्तन होता है यह निर्धारित करने के लिए TYPE_WINDOW_STATE_CHANGED ईवेंट प्रकार की जांच करें।
  • जांचें कि क्या खिड़की PackageManager.getActivityInfo() फोन करके एक गतिविधि है।

लाभ

  • एंड्रॉइड 7.1 (एपीआई 25) के माध्यम से Android 2.2 (एपीआई 8) में परीक्षण और काम करना
  • मतदान की आवश्यकता नहीं है
  • GET_TASKS अनुमति की आवश्यकता नहीं है

नुकसान

  • प्रत्येक उपयोगकर्ता को Android की एक्सेस-योग्यता सेटिंग में सेवा को सक्षम करना होगा
  • सेवा हमेशा चल रही है
  • जब कोई उपयोगकर्ता AccessibilityService को सक्षम करने का प्रयास करता है, तो एप्लिकेशन को ओके बटन दबाया नहीं जा सकता है यदि कोई ऐप स्क्रीन पर ओवरले रखता है। कुछ ऐसे ऐप्स हैं जो वेलिस ऑटो ब्राइटनेस और लक्स हैं। यह भ्रामक हो सकता है क्योंकि उपयोगकर्ता को पता नहीं है कि वह बटन दबाए नहीं जा सकते हैं या इसके चारों ओर कैसे काम कर सकते हैं।
  • AccessibilityService गतिविधि की पहली परिवर्तन तक वर्तमान गतिविधि को नहीं जान पाएगी।

उदाहरण

सर्विस

 public class WindowChangeDetectingService extends AccessibilityService { @Override protected void onServiceConnected() { super.onServiceConnected(); //Configure these here for compatibility with API 13 and below. AccessibilityServiceInfo config = new AccessibilityServiceInfo(); config.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED; config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; if (Build.VERSION.SDK_INT >= 16) //Just in case this helps config.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; setServiceInfo(config); } @Override public void onAccessibilityEvent(AccessibilityEvent event) { if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { if (event.getPackageName() != null && event.getClassName() != null) { ComponentName componentName = new ComponentName( event.getPackageName().toString(), event.getClassName().toString() ); ActivityInfo activityInfo = tryGetActivity(componentName); boolean isActivity = activityInfo != null; if (isActivity) Log.i("CurrentActivity", componentName.flattenToShortString()); } } } private ActivityInfo tryGetActivity(ComponentName componentName) { try { return getPackageManager().getActivityInfo(componentName, 0); } catch (PackageManager.NameNotFoundException e) { return null; } } @Override public void onInterrupt() {} } 

AndroidManifest.xml

इसे अपने मेनिफेस्ट में मिलाएं:

 <application> <service android:label="@string/accessibility_service_name" android:name=".WindowChangeDetectingService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService"/> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibilityservice"/> </service> </application> 

सेवा जानकारी

इसे res/xml/accessibilityservice.xml :

 <?xml version="1.0" encoding="utf-8"?> <!-- These options MUST be specified here in order for the events to be received on first start in Android 4.1.1 --> <accessibility-service xmlns:tools="http://schemas.android.com/tools" android:accessibilityEventTypes="typeWindowStateChanged" android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFlags="flagIncludeNotImportantViews" android:description="@string/accessibility_service_description" xmlns:android="http://schemas.android.com/apk/res/android" tools:ignore="UnusedAttribute"/> 

सेवा को सक्षम करना

एप के प्रत्येक उपयोगकर्ता को AccessibilityService करने के लिए AccessibilityService को स्पष्ट रूप से सक्षम करने की आवश्यकता होगी। इसे कैसे करें यह स्टैक ओव्हरफ्लो जवाब देखें।

ध्यान दें कि उपयोगकर्ता एक्सेस बटन को सक्षम करने का प्रयास करते समय ओके बटन दबाए नहीं जा पाएगा, यदि ऐप ने स्क्रीन पर ओवरले लगाया है, जैसे कि वेलिस ऑटो ब्राइटनेस या लक्स।

ActivityManager उपयोग करें

यदि आप केवल वर्तमान गतिविधि वाले एप्लिकेशन को जानना चाहते हैं, तो आप ActivityManager का उपयोग कर ऐसा कर सकते हैं। तकनीक का उपयोग आप एंड्रॉइड के संस्करण पर निर्भर कर सकते हैं:

  • प्री-लॉलीपॉप: ActivityManager.getRunningTasks ( उदाहरण )
  • लॉलीपॉप: ActivityManager.getRunningAppProcesses ( उदाहरण )

लाभ

  • सभी एंड्रॉइड संस्करणों में आज तक काम करना चाहिए

नुकसान

  • एंड्रॉइड एम में काम नहीं करता है (प्री-रिलीज़ एमुलेटर का उपयोग कर परीक्षण के आधार पर)
  • इन एपीआई के दस्तावेज का कहना है कि वे केवल डीबगिंग और प्रबंधन यूजर इंटरफेस के लिए हैं।
  • यदि आप वास्तविक समय अपडेट चाहते हैं, तो आपको मतदान का उपयोग करना होगा।
  • एक छिपे हुए एपीआई पर निर्भर करता है: ActivityManager.RunningAppProcessInfo.processState मैनेजर। आरिंगआपप्रक्रियाइन्फ़ो.प्रोसिस्टस्टेट
  • यह कार्यान्वयन ऐप स्विचर गतिविधि को नहीं उठाता है।

उदाहरण ( केनैतों के कोड पर आधारित)

 public class CurrentApplicationPackageRetriever { private final Context context; public CurrentApplicationPackageRetriever(Context context) { this.context = context; } public String[] get() { if (Build.VERSION.SDK_INT < 21) return getPreLollipop(); else return getLollipop(); } private String[] getPreLollipop() { @SuppressWarnings("deprecation") List<ActivityManager.RunningTaskInfo> tasks = activityManager().getRunningTasks(1); ActivityManager.RunningTaskInfo currentTask = tasks.get(0); ComponentName currentActivity = currentTask.topActivity; return new String[] { currentActivity.getPackageName() }; } private String[] getLollipop() { final int PROCESS_STATE_TOP = 2; try { Field processStateField = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState"); List<ActivityManager.RunningAppProcessInfo> processes = activityManager().getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo process : processes) { if ( // Filters out most non-activity processes process.importance <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && // Filters out processes that are just being // _used_ by the process with the activity process.importanceReasonCode == 0 ) { int state = processStateField.getInt(process); if (state == PROCESS_STATE_TOP) /* If multiple candidate processes can get here, it's most likely that apps are being switched. The first one provided by the OS seems to be the one being switched to, so we stop here. */ return process.pkgList; } } } catch (NoSuchFieldException | IllegalAccessException e) { throw new RuntimeException(e); } return new String[] { }; } private ActivityManager activityManager() { return (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); } } 

प्रकट

AndroidManifest.xml को GET_TASKS अनुमति जोड़ें:

 <!--suppress DeprecatedClassUsageInspection --> <uses-permission android:name="android.permission.GET_TASKS" /> 

मैं अपने परीक्षणों के लिए इसका उपयोग कर रहा हूं। यह एपीआई> 1 9 है, और केवल आपके एप की गतिविधियों के लिए, यद्यपि।

 @TargetApi(Build.VERSION_CODES.KITKAT) public static Activity getRunningActivity() { try { Class activityThreadClass = Class.forName("android.app.ActivityThread"); Object activityThread = activityThreadClass.getMethod("currentActivityThread") .invoke(null); Field activitiesField = activityThreadClass.getDeclaredField("mActivities"); activitiesField.setAccessible(true); ArrayMap activities = (ArrayMap) activitiesField.get(activityThread); for (Object activityRecord : activities.values()) { Class activityRecordClass = activityRecord.getClass(); Field pausedField = activityRecordClass.getDeclaredField("paused"); pausedField.setAccessible(true); if (!pausedField.getBoolean(activityRecord)) { Field activityField = activityRecordClass.getDeclaredField("activity"); activityField.setAccessible(true); return (Activity) activityField.get(activityRecord); } } } catch (Exception e) { throw new RuntimeException(e); } throw new RuntimeException("Didn't find the running activity"); } 

मुझे कोई ऐसा समाधान नहीं मिल सका है जिसकी हमारी टीम खुश होगी, इसलिए हमने अपना अपना लुढ़का दिया। हम वर्तमान गतिविधि का ट्रैक रखने के लिए और फिर एक सेवा के माध्यम से इसे उजागर करने के लिए ActivityLifecycleCallbacks का उपयोग करते हैं:

 public interface ContextProvider { Context getActivityContext(); } public class MyApplication extends Application implements ContextProvider { private Activity currentActivity; @Override public Context getActivityContext() { return currentActivity; } @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { MyApplication.this.currentActivity = activity; } @Override public void onActivityStarted(Activity activity) { MyApplication.this.currentActivity = activity; } @Override public void onActivityResumed(Activity activity) { MyApplication.this.currentActivity = activity; } @Override public void onActivityPaused(Activity activity) { MyApplication.this.currentActivity = null; } @Override public void onActivityStopped(Activity activity) { // don't clear current activity because activity may get stopped after // the new activity is resumed } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { // don't clear current activity because activity may get destroyed after // the new activity is resumed } }); } } 

ContextProvider लिए MyApplication उदाहरण वापस करने के लिए, फिर अपने DI कंटेनर को कॉन्फ़िगर करें

 public class ApplicationModule extends AbstractModule { @Provides ContextProvider provideMainActivity() { return MyApplication.getCurrent(); } } 

(ध्यान दें कि getCurrent() का कार्यान्वयन उपरोक्त कोड से छोड़ा जाता है। यह सिर्फ एक स्थैतिक चर है जो एप्लिकेशन कन्स्ट्रक्टर से सेट किया गया है)

इसके द्वारा किया जा सकता है:

  1. अपने स्वयं के आवेदन वर्ग को कार्यान्वित करें, ActivityLifecycle कॉलबैक के लिए पंजीकरण करें – इस तरह आप देख सकते हैं कि हमारे ऐप के साथ क्या चल रहा है फिर से शुरू होने पर कॉलबैक स्क्रीन पर वर्तमान दृश्य गतिविधि को आवंटित करता है और रोकते हुए इसे असाइनमेंट को निकाल देता है। यह विधि registerActivityLifecycleCallbacks() गतिविधि का उपयोग करता है registerActivityLifecycleCallbacks() जो कि एपीआई 14 में जोड़ा गया था।

     public class App extends Application { private Activity activeActivity; @Override public void onCreate() { super.onCreate(); setupActivityListener(); } private void setupActivityListener() { registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { activeActivity = activity; } @Override public void onActivityPaused(Activity activity) { activeActivity = null; } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } }); } public Activity getActiveActivity(){ return activeActivity; } } 
  2. आपकी सेवा कॉल getApplication() और इसे अपने ऐप क्लास नेम (इस मामले में ऐप) में डालें। आप app.getActiveActivity() को कॉल कर सकते हैं। app.getActiveActivity() – जो आपको एक चालू दिखाई गतिविधि देगी (या जब कोई गतिविधि दिखाई नहीं देगी)। आप activeActivity.getClass().getSimpleName() कॉल करके गतिविधि का नाम प्राप्त कर सकते हैं activeActivity.getClass().getSimpleName()

यह मेरा जवाब है जो काम करता है ठीक है …

आप इस तरह से वर्तमान गतिविधि प्राप्त करने में सक्षम होना चाहिए … यदि आप अपने ऐप को कई टुकड़ों के साथ कुछ क्रियाकलापों के साथ बनाते हैं और आप अपनी मौजूदा गतिविधि का ट्रैक रखना चाहते हैं, तो यह बहुत काम ले सकता है। मेरे सिन्नारियो में मेरे पास कई टुकड़े के साथ एक गतिविधि थी इसलिए मैं चालू ऑब्जेक्ट के माध्यम से चालू गतिविधि का ट्रैक रख सकता हूं, जो वैश्विक चर की सभी वर्तमान स्थिति को स्टोर कर सकता है।

यहाँ एक तरीका है जब आप अपनी गतिविधि शुरू करते हैं, तो आप उस गतिविधि को एप्लिकेशन द्वारा स्टोर करते हैं .सेटअक्षम गतिविधि (getIntent ()); यह एप्लिकेशन इसे स्टोर करेगा आपकी सेवा वर्ग में, आप बस इन्टेंट चालू इंपेंटेंट = अनुप्रयोग .getCurrentActivity () की तरह कर सकते हैं; । GetApplication () startActivity (currentIntent);

एपीआई 21 या इसके बाद के संस्करण के लिए इस कोड का उपयोग करें यह काम करता है और अन्य उत्तरों की तुलना में बेहतर परिणाम देता है, यह पूरी तरह अग्रभूमि प्रक्रिया का पता लगाता है

 if (Build.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<Long, UsageStats>(); for (UsageStats usageStats : applist) { mySortedMap.put(usageStats.getLastTimeUsed(), usageStats); } if (mySortedMap != null && !mySortedMap.isEmpty()) { currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); } } 

मुझे नहीं पता कि यह एक बेवकूफ जवाब है, लेकिन इस समस्या का समाधान किसी भी गतिविधि के क्रिएट () में दर्ज किए गए हर समय साझा वरीयताओं में ध्वज को संभाल कर, तब मैंने मूल्य को वरीयताओं से इस्तेमाल किया, यह पता लगाने के लिए कि यह अग्रभूमि गतिविधि क्या है