2010-07-13 11 views
15

तो मेरी गतिविधि है, और "छोड़ें" बटन दबाकर मैं गतिविधि.फिनिश() को कॉल करता हूं। यह प्रभावी रूप से मेरे आवेदन को बंद कर देता है।अपनी खुद की गतिविधि को कैसे मारें - कठिन तरीका

समस्या: मेरे आवेदन की दल्विक प्रक्रिया अभी भी पृष्ठभूमि में एक ज़ोंबी के रूप में लटक रही है। ऐसा लगता है कि यह सामान्य है क्योंकि अन्य अनुप्रयोग समान होते हैं। यहां तक ​​कि हैलो-वर्ल्ड उदाहरण स्मृति में चारों ओर लटकता है ..

मैं इसके साथ रह सकता था, लेकिन दुर्भाग्य से यह व्यवहार मेरे आवेदन के विकास को दर्द देता है। मेरे पास मेरी गतिविधि से जुड़ी एक दूरस्थ सेवा है, और यह सेवा तब तक अनलोड नहीं होगी जब तक कि मेरी गतिविधि अनलोड नहीं हो जाती (जैसा कि कहा गया है कि यह कभी नहीं करता है)।

किसी भी अच्छे कारण के लिए सब कुछ जीवित नहीं रखा जाता है।

मैं वास्तव में मेमोरी से मेरी गतिविधि को कैसे हटा सकता हूं?

मैं गतिविधि.finish_and_kill_my_process_please() कॉल या कुछ इसी तरह की कुछ ढूंढ रहा हूं।

उत्तर

8

तो मैं अपने गतिविधि है, और एक "छोड़ो" दबाने पर बटन मैं() Activity.finish कहते हैं। यह प्रभावी ढंग से मेरा आवेदन बंद कर देता है।

Please don't do this

अपने आवेदन की Dalvik-प्रक्रिया अभी भी पृष्ठभूमि में एक ज़ोंबी के रूप में चारों ओर लटक रहा है।

एंड्रॉइड द्वारा संभावित पुन: उपयोग के लिए प्रक्रिया को कैश में रखा जाता है। आप इसे सुरक्षित रूप से अनदेखा कर सकते हैं।

मैं मेरे गतिविधि से जुड़े एक दूरस्थ सेवा है, और इस सेवा करेंगे मेरी गतिविधि तक नहीं अनलोड अनलोड (जो के रूप ने कहा कि यह कभी नहीं करता है)।

आप शायद एक बग अपने आवेदन में, इस तरह के startService() बुला और stopService() फोन करने में नाकाम रहने के लिए, या bindService() बुला और unbindService() फोन करने में नाकाम रहने के रूप में की है।

6

killBackgroundProcesses विधि का उपयोग कर प्रयास करें:

ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
activityManager.killBackgroundProcesses("name.of.your.package"); 

आप अपने AndroidManifest.xml फाइल करने के लिए KILL_BACKGROUND_PROCESSES अनुमति जोड़ने की आवश्यकता होगी।

+0

ठीक है, ऐसा लगता है कि यह विधि अब गतिविधि प्रबंधक वर्ग का हिस्सा नहीं है ?? – bugzy

+0

Android 2.2 Froyo के लिए एक नया एपीआई है लेकिन यह एक बहुत बुरा विचार है। उन अनुमतियों को खतरे के रूप में चिह्नित किया गया है और उपयोगकर्ता देखेंगे कि आपके ऐप में अन्य ऐप्स को मारने की क्षमता है। – Tom

+0

एक ऐप की प्रक्रिया को समाप्त करने के दौरान विकास के दौरान अस्पष्ट परीक्षणों के बाहर लगभग कभी भी एक अच्छा विचार नहीं है, यह करने के लिए यह एक अनावश्यक रूप से चौराहे का तरीका है। एक प्रक्रिया बस बाहर निकल सकती है() या खुद को मार सकती है - इसे ऐसा करने के लिए ActivityManager से पूछने की आवश्यकता नहीं है। –

24
  1. कॉल खत्म(); बटन पर क्लिक करें
  2. OnDestroy विधि को यह पंक्ति जोड़ दें:

android.os.Process.killProcess (android.os.Process।myPid());

public void onDestroy() { 
     super.onDestroy(); 
     android.os.Process.killProcess(android.os.Process.myPid()); 
    }  
+8

एक जारी ऐप KillProcess() के लिए एक अच्छा विचार नहीं है। लेकिन विकास चरण के लिए (डीबगिंग उद्देश्यों के लिए ऐप की समाप्ति को तेज करना) यह एक जीवन बचतकर्ता है। +1। – an00b

+0

विकासशील (अस्थायी उपयोग के लिए) के दौरान निश्चित रूप से उपयोगी – Diljeet

+1

यह देशी lib को उतारने में मेरी सहायता करने के लिए उपयोगी रहा है :-) – Miquel

3

प्रक्रिया की हत्या करके आप आवेदन completely.from वापस बटन प्रेस पर पिछले स्क्रीन बंद कर सकते हैं आप द्वारा प्रक्रिया को मार सकता है:

public void onBackPressed() { 
     super.onBackPressed(); 
     int pid = android.os.Process.myPid(); 
     android.os.Process.killProcess(pid); } 
0

ActivityManager का उपयोग कर हम बंद कर सकते हैं तक एक और अनुप्रयोग भी।

private ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); 
am.restartPackage("com.jimmy.appToBeClosed"); 

उपयोग करने के लिए ऊपर दिए गए कोड मैनिफ़ेस्ट फ़ाइल में android.permission.RESTART_PACKAGE अनुमतियाँ होनी चाहिए।

+0

पुनरारंभ पैकेज अब बहिष्कृत है। इसके बजाय killBackgroundProcesses का उपयोग करें। – rfinz

4

ठीक है, न केवल गतिविधि है, लेकिन यह भी आवेदन आप को समाप्त करना चाहते हैं, तो आप उपयोग कर सकते हैं

System.exit(0)

लोगों का कहना है कि यह पदावनत है या बुरा उदाहरण है, लेकिन, अच्छी तरह से यह शुद्ध जावा है और काम करता है ...

+0

क्या आप जानते हैं कि लोग उन चीजों को क्यों कहते हैं? क्या एंड्रॉइड ओएस के भीतर एप्लिकेशन "जीवन" के साथ कुछ करने के लिए कुछ करता है? यह मेरे ऐप्स में से किसी एक में उपयोग करने के लिए प्रलोभन है .. लेकिन मैं पहले निराशा के पीछे सिद्धांत जानना चाहता हूं। – snapfractalpop

+2

अच्छा, मुझे लगता है कि वे इसे कहते हैं क्योंकि एंड्रॉइड एप्लिकेशन को ही प्रबंधित कर सकता है; इसलिए हमें अपनी नाक को पोक नहीं करना चाहिए। मैं कहता हूं कि यह बकवास है हालांकि: अगर यह मेरा आवेदन है, तो मुझे और कौन जानता है कि इसे कब समाप्त करना है? :) –

0

System.exit() तुरन्त सभी देशी पुस्तकालयों, सेवाओं के साथ पूरे आभासी मशीन अनलोड और आदि

1

System.exit के समान (0) जावा पक्ष पर, आप भी एक देशी कॉल कर सकते हैं ऑन डी के दौरान विधि एस्ट्रॉय जो सी/सी ++ पक्ष पर बाहर निकलें (0) कहता है। ऐसा लगता है कि lib पूरी तरह से बाहर निकलने के लिए मजबूर करता है। यह मेरे लिए काम कर रहा है!

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