दिलचस्प पोस्ट
परीक्षण करने के लिए एक कोर डेटा बनाने के लिए कैसे करें कि किसी संबंध में सभी ऑब्जेक्ट शामिल हैं? कैफ़े में मेरे अपने डेटासेट को प्रशिक्षण / परीक्षण कैसे करें? HTTPS url तक पहुंचने का प्रयास करते समय मैं कर्ल के उपयोग के प्रमाण पत्रों से कैसे निपटूं? Tensorflow लेबल के साथ चित्र पढ़ा मैं एक नई कुंजी बनाने के बिना कैसे SSH कुंजी के लिए पासफ़्रेज़ को निकाल सकता हूं? एसक्यूएल क्वेरी के साथ अल्पविराम से पृथक मूल्य C ++ में गतिशील रूप से आबंटित ऑब्जेक्ट के लिए पॉइंटर्स के वेक्टर का उपयोग करते समय मेमोरी लीक से कैसे बचें? कैसे एक std :: स्ट्रिंग और int जोड़ने के लिए? मैं साइट का बेसुरल कैसे प्राप्त कर सकता हूं? MATLAB संस्करण 7 में pdist2 समकक्ष तालिका में प्रत्येक समूह के लिए शीर्ष एन पंक्तियों का चयन करना जावास्क्रिप्ट के साथ स्ट्रिंग के रूप में एक HTML के डॉकटाइप प्राप्त करें सरणी के लिए JSON स्ट्रिंग कन्वर्ट करने के लिए जब जावास्क्रिप्ट का उपयोग करके एक विंडो को बदल दिया जाए तो पता लगाएंगे? मैं Angularjs विरोधक में कमांड लाइन तर्क का उपयोग कैसे कर सकता हूँ?

गतिविधि को अग्रभूमि में या दृश्यमान पृष्ठभूमि में कैसे जांचना है?

मेरे पास टाइमर पर एक छप स्क्रीन है मेरी समस्या यह है कि इससे पहले कि मैं finish() मेरी गतिविधि finish() दूं, मुझे यह देखना होगा कि अगली गतिविधि शुरू हो गई है क्योंकि एक सिस्टम संवाद बॉक्स पॉप-अप होता है और मैं केवल finish() करना चाहता हूं; एक बार उपयोगकर्ता ने संवाद बॉक्स से एक विकल्प चुना है?

मुझे पता है कि यह देखने के लिए कि आपकी गतिविधि अग्रभूमि में है या नहीं, पर कई सवाल हैं, लेकिन मुझे नहीं पता कि क्या इस गतिविधि के शीर्ष पर डायलॉग बॉक्स की अनुमति भी है

यहां समस्या है, लाल मेरी गतिविधि है जो पृष्ठभूमि में है, जबकि संवाद अग्रभूमि में है:

लाल मेरी गतिविधि है जो पृष्ठभूमि में है, जबकि बातचीत अग्रभूमि में है

संपादित करें: मैंने अभी finish() नहीं किया finish() का उपयोग finish() की कोशिश की है, लेकिन फिर मेरी गतिविधियों को उन अनुप्रयोगों के स्टैक में वापस चलाया जा सकता है जो मैं बचने का प्रयास कर रहा हूं

Solutions Collecting From Web of "गतिविधि को अग्रभूमि में या दृश्यमान पृष्ठभूमि में कैसे जांचना है?"

यह सही समाधान के रूप में सिफारिश की गई है:

सही समाधान (क्रेडिट दान, कॉमन्सवर और नीते इनस्टीईएन पर जाते हैं) गतिविधि का उपयोग करके अपने आवेदन की दृश्यता ट्रैक करें। रोकें, गतिविधि। किसी अन्य कक्षा में "दृश्यता" स्थिति को स्टोर करें अच्छा विकल्प आपके आवेदन या सेवा के स्वयं के कार्यान्वयन (इस समाधान के कुछ रूप भी हैं यदि आप गतिविधि से गतिविधि की दृश्यता जांचना चाहते हैं)।

उदाहरण कस्टम अनुप्रयोग वर्ग लागू करें (ध्यान दें isActivityVisible () स्थैतिक विधि):

 public class MyApplication extends Application { public static boolean isActivityVisible() { return activityVisible; } public static void activityResumed() { activityVisible = true; } public static void activityPaused() { activityVisible = false; } private static boolean activityVisible; } 

AndroidManifest.xml में अपना एप्लिकेशन क्लास पंजीकृत करें:

 <application android:name="your.app.package.MyApplication" android:icon="@drawable/icon" android:label="@string/app_name" > 

प्रोजेक्ट में प्रत्येक गतिविधि के लिए पॉज़ एंड ऑन रिप्स पर जोड़ें (आप अपनी क्रियाकलापों के लिए एक सामान्य पूर्वजों को बना सकते हैं यदि आप चाहते हैं, लेकिन अगर आपकी गतिविधि पहले से ही MapActivity / ListActivity आदि से बढ़ी है। आपको अभी भी हाथ से लिखना होगा) :

 @Override protected void onResume() { super.onResume(); MyApplication.activityResumed(); } @Override protected void onPause() { super.onPause(); MyApplication.activityPaused(); } 

आपकी isActivityVisible() finish() विधि में, आप यह है कि गतिविधि सक्रिय है या नहीं, यह देखने के लिए isActivityVisible() का उपयोग करना चाहते हैं। वहां आप यह भी देख सकते हैं कि उपयोगकर्ता ने कोई विकल्प चुना है या नहीं। जारी रखें जब दोनों शर्तें पूरी हो जाएं

स्रोत भी दो गलत समाधानों का उल्लेख करता है … इसलिए ऐसा करने से बचें

स्रोत: स्टैकहोवरफ्लो

अगर एपीआई स्तर 14 या उससे ऊपर लक्ष्यीकरण, तो एंड्रॉइड.एप.एप्लिकेशन का उपयोग कर सकते हैं। एक्टिविटी लाइफ साइकिल कॉलबैक

 public class MyApplication extends Application implements ActivityLifecycleCallbacks { private static boolean isInterestingActivityVisible; @Override public void onCreate() { super.onCreate(); // Register to be notified of activity state changes registerActivityLifecycleCallbacks(this); .... } public boolean isInterestingActivityVisible() { return isInterestingActivityVisible; } @Override public void onActivityResumed(Activity activity) { if (activity instanceof MyInterestingActivity) { isInterestingActivityVisible = true; } } @Override public void onActivityStopped(Activity activity) { if (activity instanceof MyInterestingActivity) { isInterestingActivityVisible = false; } } // Other state change callback stubs .... } 

गतिविधि वर्ग के दस्तावेजों में वर्णित अनुसार क्रियाकलापों की onStop और onStop के बारे में बिल्कुल अंतर है।

अगर मैं आपको सही ढंग से समझता हूं, तो आप क्या करना चाहते हैं, आपकी गतिविधि से कॉल finish() समाप्त होती है। गतिविधि जीवनचक्र डेमो ऐप की संलग्न छवि देखें ऐसा लगता है कि जब गतिविधि बी को गतिविधि ए से लॉन्च किया गया है। ईवेंट का क्रम नीचे से ऊपर है ताकि आप देख सकें कि गतिविधि ए onStop को गतिविधि बी के बाद कहा जाता है, फिर onResume को पहले से ही फोन किया गया था।

गतिविधि जीवनचक्र डेमो

यदि कोई डायलॉग दिखाया गया है कि आपकी गतिविधि को पृष्ठभूमि में मंद कर दिया गया है और केवल onPause को कहा जाता है।

दो संभावित समाधान:

1) गतिविधि जीवनकाल कॉलबैक

एक ऐप का उपयोग करें जो ActivityLifecycle कॉलबैक लागू करता है और इसका उपयोग आप एप्लिकेशन में जीवनचर्या की गतिविधियों को ट्रैक करने के लिए करते हैं। नोट करें कि ActivityLifecycle कॉलबैक एंड्रॉइड एपीआई के लिए हैं> = 14. पिछले एंड्रॉइड एपीआई के लिए, आपको अपने सभी गतिविधियों में इसे स्वयं लागू करना होगा 😉

जब आपको गतिविधियों पर राज्यों को साझा / स्टोर करने की आवश्यकता होती है, तब आवेदन का उपयोग करें।

2) प्रक्रिया प्रक्रिया चलाने के लिए जाँचें

आप RunningAppProcessInfo इस वर्ग के साथ चल रहे प्रक्रिया की स्थिति की जांच कर सकते हैं

ActivityManager.getRunningAppProcesses () के साथ चल रहे प्रक्रिया सूची को प्राप्त करें और अपेक्षित RunningAppProcessInfo के लिए जांच करने के लिए परिणाम सूची को फ़िल्टर करें और इसकी "महत्व"

मैंने गिटूब ऐप-अग्रभूमि-पृष्ठभूमि पर प्रोजेक्ट तैयार किया है- सुनें

जो सभी एंड्रॉइड एपीआई स्तर के साथ बहुत आसान तर्क का उपयोग करता है और ठीक काम करता है।

पृष्ठभूमि से विराम और फिर से शुरू के बीच समय सीमा का उपयोग करें, यह निर्धारित करें कि क्या यह पृष्ठभूमि से जाग है या नहीं

कस्टम अनुप्रयोग में

 private static boolean isInBackground; private static boolean isAwakeFromBackground; private static final int backgroundAllowance = 10000; public static void activityPaused() { isInBackground = true; final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { if (isInBackground) { isAwakeFromBackground = true; } } }, backgroundAllowance); Log.v("activity status", "activityPaused"); } public static void activityResumed() { isInBackground = false; if(isAwakeFromBackground){ // do something when awake from background Log.v("activity status", "isAwakeFromBackground"); } isAwakeFromBackground = false; Log.v("activity status", "activityResumed"); } 

बेसएक्टिविटी क्लास में

 @Override protected void onResume() { super.onResume(); MyApplication.activityResumed(); } @Override protected void onPause() { super.onPause(); MyApplication.activityPaused(); } 

क्या आपने फिनिश को फोन करने की कोशिश नहीं की, और "एंड्रॉइड: noHistory =" मैनेस्टेस्ट में "सच" डालने का प्रयास किया? यह स्टैक पर जाने से गतिविधि को रोक देगा

मुझे यह कहना है कि आपका वर्कफ़्लो मानक एंड्रॉइड में नहीं है। एंड्रॉइड में, यदि आप आशय से कोई अन्य गतिविधि खोलना चाहते हैं, तो आपको अपनी गतिविधि finish() करने की आवश्यकता नहीं है। उपयोगकर्ता की सुविधा के लिए, एंड्रॉइड उपयोगकर्ता को आपके ऐप के लिए खोले गए गतिविधि से वापस जाने के लिए 'बैक' कुंजी का इस्तेमाल करने की अनुमति देता है

तो बस सिस्टम को आपको गतिविधि को रोक दें और जब भी आपको गतिविधि को वापस बुलाया जाता है, तब कुछ भी बचाना चाहिए।

मुझे लगता है कि मेरे पास बेहतर समाधान है क्योंकि आप बस MyApplication.activityResumed () में बना सकते हैं; प्रत्येक गतिविधि को विस्तारित करने के लिए।

सबसे पहले आपको बनाना होगा (जैसे साइबरनेटिकटेवरकगुरुओआरसी)

 public class MyApplication extends Application { public static boolean isActivityVisible() { return activityVisible; } public static void activityResumed() { activityVisible = true; } public static void activityPaused() { activityVisible = false; } private static boolean activityVisible; } 

अगला, आपको AndroidManifest.xml को एप्लिकेशन क्लास जोड़ना होगा

 <application android:name="your.app.package.MyApplication" android:icon="@drawable/icon" android:label="@string/app_name" > 

फिर, कक्षा गतिविधिबेस बनाएं

 public class ActivityBase extends Activity { @Override protected void onPause() { super.onPause(); MyApplication.activityPaused(); } @Override protected void onResume() { super.onResume(); MyApplication.activityResumed(); } } 

अंत में, जब आप नई गतिविधि को क्रेट करते हैं, तो आप गतिविधि के बजाय गतिविधि बैज द्वारा इसे बढ़ा सकते हैं।

 public class Main extends ActivityBase { @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } } 

मेरे लिए यह बेहतर तरीका है क्योंकि आपको सिर्फ गतिविधि बज़ के विस्तार के बारे में याद रखना है। इसके अलावा आप भविष्य में अपने बेस फंक्शन का विस्तार कर सकते हैं। मेरे मामले में मैंने एक कक्षा में नेटवर्क के बारे में अपनी सेवा और अलर्ट के लिए रिसीवर जोड़े।

यदि आप अपने ऐप की दृश्यता की जांच करना चाहते हैं, तो आप बस कॉल कर सकते हैं

 MyApplication.isActivityVisible() 

अगर आपको रोका गया या फिर से शुरू किया गया है तो झंडे को सहेजें यदि आप फिर से शुरू होते हैं तो इसका अर्थ है कि आप अग्रभूमि में हैं

 boolean isResumed = false; @Override public void onPause() { super.onPause(); isResumed = false; } @Override public void onResume() { super.onResume(); isResumed = true; } private void finishIfForeground() { if (isResumed) { finish(); } } 

एक संभावित समाधान सिस्टम-डायलॉग को दिखाते समय एक फ़्लैग सेट कर रहा है और फिर जीवन चक्र के गतिविधि की ऊपरी विधि में, ध्वज के लिए जांचें, यदि सही हो, तो गतिविधि समाप्त करें।

उदाहरण के लिए, यदि सिस्टम संवाद कुछ बटन क्लिक द्वारा ट्रिगर किया गया है, तो onclick श्रोता की तरह हो सकता है

 private OnClickListener btnClickListener = new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.setType("text/plain"); CheckActivity.this.startActivity(Intent.createChooser(intent, "Complete action using")); checkFlag = true; //flag used to check } }; 

और गतिविधि के बाद में:

 @Override protected void onStop() { if(checkFlag){ finish(); } super.onStop(); } 

क्यों इस के लिए प्रसारण का उपयोग नहीं? दूसरी गतिविधि (जो कि ऊपर होना चाहिए) एक स्थानीय प्रसारण इस प्रकार भेज सकते हैं:

 //put this in onCreate(..) or any other lifecycle method that suits you best //notice the string sent to the intent, it will be used to register a receiver! Intent result = new Intent("broadcast identifier"); result.putString("some message");//this is optional LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(result); 

फिर छप गतिविधि के भीतर एक साधारण रिसीवर लिखें:

 //this goes on the class level (like a class/instance variable, not in a method) of your splash activity: private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //kill activity here!!! //mission accomplished! } }; 

और अपनी दूसरी गतिविधि से प्रसारण को सुनने के लिए LocalBroadcastManager से अपना नया रिसीवर पंजीकृत करें:

 //notice the string sent to the intent filter, this is where you tell the BroadcastManager which broadcasts you want to listen to! LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(receiver, new IntentFilter("broadcast identifier")); 

ध्यान दें कि आप "प्रसारण पहचानकर्ता" स्ट्रिंग के लिए निरंतर या स्ट्रिंग संसाधन का उपयोग कर सकते हैं।

यदि आप अपने ऐप के स्टैक (कार्य) में शुरू करने के लिए नए एप से बचने के लिए finish() उपयोग करते हैं, तो आप Intent.FLAG_ACTIVITY_NEW_TASK उपयोग कर सकते हैं। Intent.FLAG_ACTIVITY_NEW_TASK फ्लैग, नया अनुप्रयोग प्रारंभ करते समय और finish() को बिल्कुल भी कॉल न करें। दस्तावेज़ीकरण के अनुसार, यह एक "लांचर" शैली व्यवहार को लागू करने के लिए इस्तेमाल किया जाने वाला ध्वज है

 // just add this line before you start an activity intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 

यह अनुप्रयोग का उपयोग करके एक कुशल तरीके से इसे प्राप्त कर सकता है। गतिविधि लाइफ साइकोलैकबैक

उदाहरण के लिए, एफ़टीपी क्लास का नाम प्रोफ़ाइल के रूप में ले जाता है, यह पता चलता है कि यह अग्रभूमि या पृष्ठभूमि में है या नहीं

पहले हमें एप्लिकेशन क्लास का विस्तार करके हमारे एपलीकेशन क्लास को बनाने की जरूरत है

जो लागू करता है

Application.ActivityLifecycleCallbacks

निम्न के रूप में मेरा आवेदन वर्ग बनें

आवेदन वर्ग

 public class AppController extends Application implements Application.ActivityLifecycleCallbacks { private boolean activityInForeground; @Override public void onCreate() { super.onCreate(); //register ActivityLifecycleCallbacks registerActivityLifecycleCallbacks(this); } public static boolean isActivityVisible() { return activityVisible; } public static void activityResumed() { activityVisible = true; } public static void activityPaused() { activityVisible = false; } private static boolean activityVisible; @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { //Here you can add all Activity class you need to check whether its on screen or not activityInForeground = activity instanceof ProfileActivity; } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } public boolean isActivityInForeground() { return activityInForeground; } } 

उपरोक्त वर्ग में गतिविधि पर एक ओवरराइड मेथोडर्ड है गतिविधि गतिविधि का पुनरावर्ती जीवन चक्र कॉलबैक

  @Override public void onActivityResumed(Activity activity) { //Here you can add all Activity class you need to check whether its on screen or not activityInForeground = activity instanceof ProfileActivity; } 

जहां वर्तमान में स्क्रीन पर प्रदर्शित सभी गतिविधि उदाहरण मिल सकते हैं, बस जांच लें कि आपकी गतिविधि स्क्रीन पर है या नहीं ऊपर की विधि द्वारा।

Manifest.xml में अपना एप्लिकेशन क्लास पंजीकृत करें

 <application android:name=".AppController" /> 

मौसम की गतिविधि की जांच करने के लिए अग्रभूमि समाधान के अनुसार अग्रभूमि या पृष्ठभूमि पर उन स्थानों पर निम्नलिखित पद्धति को कॉल करें जिन पर आपको चेक करना होगा

 AppController applicationControl = (AppController) getApplicationContext(); if(applicationControl.isActivityInForeground()){ Log.d("TAG","Activity is in foreground") } else { Log.d("TAG","Activity is in background") } 

किसी Activity अंदर इन विधियों का उपयोग करें

isDestroyed()

एपीआई 17 में जोड़ा गया
वास्तविकता यदि अंतिम ऑनस्टोरॉय () कॉल की गतिविधि पर किया गया है, तो यह उदाहरण अब मृत है।

isFinishing()

एपी 1 में जोड़ा गया
यह देखने के लिए जांचें कि क्या यह गतिविधि परिष्करण की प्रक्रिया में है या नहीं, या तो क्योंकि आपने इसे खत्म कर दिया है या किसी अन्य ने अनुरोध किया है कि यह समाप्त हो जाएगा। यह आमतौर पर onause () में प्रयोग किया जाता है, यह निर्धारित करने के लिए कि गतिविधि केवल रोक या पूरी तरह खत्म हो रही है या नहीं।

मेमोरी लीक प्रलेखन से

AsyncTask साथ एक आम गलती है होस्ट Activity (या Fragment ) का एक मजबूत संदर्भ कैप्चर करना:

 class MyActivity extends Activity { private AsyncTask<Void, Void, Void> myTask = new AsyncTask<Void, Void, Void>() { // Don't do this! Inner classes implicitly keep a pointer to their // parent, which in this case is the Activity! } } 

यह एक समस्या है क्योंकि AsyncTask आसानी से पैरेंट Activity जीवित कर सकता है, उदाहरण के लिए यदि कार्य चालू हो रहा है, तो एक कॉन्फ़िगरेशन बदलाव होता है।

ऐसा करने का सही तरीका अपने काम को एक static वर्ग बनाना है, जो माता-पिता को कैप्चर नहीं करता है, और मेजबान Activity को एक कमजोर संदर्भ रखता है:

 class MyActivity extends Activity { static class MyTask extends AsyncTask<Void, Void, Void> { // Weak references will still allow the Activity to be garbage-collected private final WeakReference<MyActivity> weakActivity; MyTask(MyActivity myActivity) { this.weakActivity = new WeakReference<>(myActivity); } @Override public Void doInBackground(Void... params) { // do async stuff here } @Override public void onPostExecute(Void result) { // Re-acquire a strong reference to the activity, and verify // that it still exists and is active. MyActivity activity = weakActivity.get(); if (activity == null || activity.isFinishing() || activity.isDestroyed()) { // activity is no longer valid, don't do anything! return; } // The activity is still valid, do main-thread stuff here } } } 

यहां Application वर्ग का उपयोग कर एक समाधान है।

 public class AppSingleton extends Application implements Application.ActivityLifecycleCallbacks { private WeakReference<Context> foregroundActivity; @Override public void onActivityResumed(Activity activity) { foregroundActivity=new WeakReference<Context>(activity); } @Override public void onActivityPaused(Activity activity) { String class_name_activity=activity.getClass().getCanonicalName(); if (foregroundActivity != null && foregroundActivity.get().getClass().getCanonicalName().equals(class_name_activity)) { foregroundActivity = null; } } //............................ public boolean isOnForeground(@NonNull Context activity_cntxt) { return isOnForeground(activity_cntxt.getClass().getCanonicalName()); } public boolean isOnForeground(@NonNull String activity_canonical_name) { if (foregroundActivity != null && foregroundActivity.get() != null) { return foregroundActivity.get().getClass().getCanonicalName().equals(activity_canonical_name); } return false; } } 

आप इसे बस इस तरह से उपयोग कर सकते हैं,

 ((AppSingleton)context.getApplicationContext()).isOnForeground(context_activity); 

यदि आपके पास आवश्यक गतिविधि का कोई संदर्भ है या गतिविधि का कैननियक नाम का उपयोग कर रहा है, तो आप यह पता कर सकते हैं कि यह अग्रभूमि में है या नहीं। यह समाधान आसान नहीं हो सकता है। इसलिए आपकी टिप्पणी सचमुच स्वागत है

मुझे नहीं पता है कि क्यों साझा किए गए प्रस्तावों के बारे में कोई बात नहीं, गतिविधि ए के लिए, उस तरह एक शेडपीप्रेचर सेट करना (उदाहरण के लिए onPause () में):

 SharedPreferences pref = context.getSharedPreferences(SHARED_PREF, 0); SharedPreferences.Editor editor = pref.edit(); editor.putBoolean("is_activity_paused_a", true); editor.commit(); 

मुझे लगता है कि यह गतिविधियों की निगरानी के लिए विश्वसनीय तरीका है।

क्या Activity.onWindowFocusChanged(boolean hasFocus) यहां उपयोगी साबित होगा? कि, प्लस एक वर्ग-स्तरीय ध्वज, जैसा कुछ है, isFocused कि onWindowFocusChanged सेट onWindowFocusChanged , यह आपकी गतिविधि में किसी भी बिंदु पर बताने का आसान तरीका होगा यदि वह केंद्रित है या नहीं। डॉक्स पढ़ने से, ऐसा लगता है कि यह किसी भी स्थिति में "झूठी" को ठीक से सेट कर देगा जहां गतिविधि सीधे भौतिक "अग्रभूमि" में नहीं है, जैसे कि एक संवाद प्रदर्शित किया जा रहा है या अधिसूचना ट्रे को नीचे खींचा गया है।

उदाहरण:

 boolean isFocused; @Override void onWindowFocusChanged (boolean hasFocus) { super.onWindowFocusChanged(hasFocus); isFocused = hasFocus; } void someMethod() { if (isFocused) { // The activity is the foremost object on the screen } else { // The activity is obscured or otherwise not visible } } 

मैं ऐसा करता था,

अगर गतिविधि अग्रभूमि में नहीं है

getIntent ()

नल वापस आ जाएगी : = पी