सबसे पहले, मुझे पता है कि किसी को एंड्रॉइड पर एप्लिकेशन को वास्तव में मारना / पुनः आरंभ नहीं करना चाहिए। मेरे उपयोग के मामले में मैं अपने आवेदन को एक विशिष्ट मामले में फ़ैक्टरी-रीसेट करना चाहता हूं जहां एक सर्वर क्लाइंट को एक विशिष्ट जानकारी भेजता है।
उपयोगकर्ता केवल एप्लिकेशन के एक उदाहरण (यानी कई उपकरणों की अनुमति नहीं है) के साथ सर्वर पर लॉग इन किया जा सकता है। यदि किसी अन्य उदाहरण में "लॉग-इन" -लॉक मिलता है, तो उस उपयोगकर्ता के अन्य सभी उदाहरणों को स्थिरता बनाए रखने के लिए अपने डेटा (फ़ैक्टरी-रीसेट) को हटाना होगा।
यह जबरन लॉक प्राप्त करने के लिए संभव है, क्योंकि उपयोगकर्ता ऐप को हटा सकता है और इसे फिर से इंस्टॉल कर सकता है जिसके परिणामस्वरूप एक अलग इंस्टेंस-आईडी होगा और उपयोगकर्ता लॉक को और अधिक मुक्त नहीं कर पाएगा। इसलिए जबरन ताला लगवाना संभव है।
उस बल-संभावना के कारण हमें हमेशा एक ठोस उदाहरण में जांचना होगा कि उसके पास ताला है। यह (लगभग) सर्वर पर प्रत्येक अनुरोध पर किया जाता है। सर्वर "गलत-लॉक-आईडी" भेज सकता है। यदि यह पता चला है, तो क्लाइंट एप्लिकेशन को सब कुछ हटाना होगा।
वह उपयोग-मामला था।
मेरे पास एक Activity
ए है जो एक साझाप्रेप्स मूल्य के आधार पर लॉगिन Activity
एल या ऐप के मुख्य Activity
बी को शुरू करता है। L या B शुरू करने के बाद यह अपने आप बंद हो जाता है ताकि केवल L या B चल रहा हो। तो इस मामले में कि उपयोगकर्ता पहले से ही लॉग इन है B अभी चल रहा है।
B, C. C startService
को IntentService
D. के लिए कॉल करना प्रारंभ करता है , जिसके परिणामस्वरूप इस स्टैक का परिणाम होता है:
(ए)> बी> सी> डी
D की एक घटना के onHandleIntent विधि से एक ResultReceiver R को भेज दिया जाता है ।
आर अब उस घटना को उपयोगकर्ता को एक संवाद प्रदान करके संभालता है, जहां वह एप्लिकेशन को फ़ैक्टरी-रीसेट करना (डेटाबेस को साझा करना, साझा करना, आदि) चुन सकता है)
फ़ैक्टरी-रीसेट के बाद मैं एप्लिकेशन को पुनरारंभ करना चाहता हूं (सभी गतिविधियों को बंद करने के लिए) और केवल ए को फिर से शुरू करें जो फिर लॉगिन Activity
एल लॉन्च करता है और खुद को समाप्त करता है:
(ए)> एल
डायलॉग की ऑन -क्लिक विधि इस तरह दिखती है:
@Override
public void onClick(DialogInterface dialog, int which) {
// Will call onCancelListener
MyApplication.factoryReset(); // (Deletes the database, clears sharedPrefs, etc.)
Intent i = new Intent(MyApp.getContext(), A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MyApp.getContext().startActivity(i);
}
और वह MyApp
वर्ग है:
public class MyApp extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
public static void factoryReset() {
// ...
}
}
समस्या यह है कि अगर मैं FLAG_ACTIVITY_NEW_TASK
गतिविधियों का उपयोग करता हूं तो B और C अभी भी चल रहे हैं। यदि मैं लॉगिन Activity
सी पर बैक बटन दबाता हूं, तो मैं होम स्क्रीन पर वापस जाना चाहता हूं।
यदि मैं सेट नहीं करता हूं तो FLAG_ACTIVITY_NEW_TASK
मुझे त्रुटि मिलती है:
07-07 12:27:12.272: ERROR/AndroidRuntime(9512): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
मैं गतिविधियों का उपयोग नहीं कर सकता Context
, क्योंकि ServiceIntent
डी को एक पृष्ठभूमि कार्य से भी बुलाया जा सकता है जिसे पृष्ठभूमि द्वारा शुरू किया गया है AlarmManager
।
तो मैं इसे (ए) एल बनने वाली गतिविधि स्टैक के लिए कैसे हल कर सकता हूं?