2012-03-21 18 views
5

मेरे कार्यक्रम को एक विशिष्ट आवेदन को मारने की जरूरत है। क्या यह स्टॉक, अनियंत्रित डिवाइस पर संभव है? यदि हां - कैसे? मैं इसकी प्रक्रिया का नाम और पीआईडी ​​जानता हूं।किसी तृतीय-पक्ष एप्लिकेशन को कैसे मारें?

+0

इसे आजमाएं http://stackoverflow.com/a/40266343/5235263 – benbas1982

उत्तर

25

एक बार फिर मैं बहुत देर से जवाब दे रहा हूं लेकिन जब से मैं एक ही स्थिति पर चलता हूं तो मैंने किसी को मदद करने के लिए अपने निष्कर्ष साझा करने का विचार किया।

सबसे पहले आपको यह समझने की जरूरत है कि आप क्या कर सकते हैं और क्या नहीं। एंड्रॉइड के दृष्टिकोण से एक आवेदन अन्य ओएस की तरह नहीं है। एक एंड्रॉइड एप्लिकेशन में कई घटक होते हैं (गतिविधियां, प्रसारण रिसीवर, सेवाएं, सबसे महत्वपूर्ण कार्य इत्यादि) जो पैकेज में पैक होते हैं। एक पैकेज में और अधिक हो सकता है कि एक घटक चल रहा है इसके घटकों के आधार पर चल रहा है।

अब दिलचस्प बात यह है कि एक Android पैकेज (एंड्रॉयड) के द्वारा मारे गए या बंद कर दिया, यदि कोई हो या इसकी प्रक्रियाओं के सभी मारे गए हैं, वास्तव में एक पैकेज अभी भी कोई प्रक्रियाओं के साथ भी चल रहा जा सकता है नहीं माना जाता है है बिल्कुल चल रहा है यदि आप एक एमुलेटर शुरू करते हैं, तो एक प्रोग्राम शुरू करें (यानी ब्राउज़र) और फिर DDMS के माध्यम से अपनी प्रक्रिया को मार दें, उसके बाद एप्लिकेशन की पैकेज सेटिंग्स (Settings --> Applications --> Manage Applications --> All --> Browser) पर जाएं, आप फोर्स स्टॉप बटन सक्षम कर सकते हैं, इसका मतलब है कि एप्लिकेशन अभी भी चल रहा है (एंड्रॉइड के दृष्टिकोण से)। यहां क्या हुआ है कि एप्लिकेशन में एक या अधिक कार्य जमे हुए हैं। यही है, एंड्रॉइड ने एप्लिकेशन की गतिविधियों (कार्य या कार्य) की स्थिति को बचाया है और इसलिए यदि उपयोगकर्ता इसे वापस लौटाता है तो पैकेज अभी भी चल रहा है या बेहतर है, वह आखिरी चीज पर उतरेगा जो वह कर रहा था। अब यदि आप फोर्स स्टॉप बटन पर क्लिक करते हैं, तो एंड्रॉइड इन सभी जमे हुए कार्यों को छोड़ देगा और जब उपयोगकर्ता एप्लिकेशन पर वापस आएगा तो वह पहली गतिविधि देखेंगे। एक कार्य ऐसा कुछ है जिसे आप मार नहीं सकते हैं (froyo से) केवल उपयोगकर्ता (फोर्स स्टॉप बटन से), सिस्टम या एक तृतीय पक्ष एप्लिकेशन जो सिस्टम की एक ही कुंजी के साथ हस्ताक्षरित है वह कर सकता है (और शायद रूट सक्षम आवेदन लेकिन मैंने इसकी पुष्टि नहीं की है)।

  1. आप android.permission.KILL_BACKGROUND_PROCESSES अनुमति है: दूसरी ओर एक प्रक्रिया कुछ तुम्हें मार और स्मृति का उपयोग करता है को पुनः प्राप्त कर सकते हैं, जब तक आप कुछ प्रतिबंध का पालन के रूप में है।
  2. प्रक्रियाएं सिस्टम या रूट प्रक्रिया नहीं हैं।
  3. प्रक्रिया एक घटक से संबंधित नहीं है जो लगातार है।
  4. प्रक्रिया किसी अन्य माध्यम से संचालित करने के लिए प्रक्रिया के लिए महत्वपूर्ण नहीं है।

नंबर 1 नियम आप उनके बारे में कुछ करने के लिए नहीं है इसके अलावा, एंड्रॉयड इस का ख्याल रखना होगा।

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

अब कोड के लिए:

अपने प्रोजेक्ट के लिए मैं तीन कार्यों तैयार किया है इस लक्ष्य को हासिल करने के लिए।

पहला पैकेज पैकेज की पहली प्रक्रिया पिड की तलाश में है और यदि कोई नहीं है तो यह -1 लौटाता है।

private Context cx; 
private ActivityManager am = (ActivityManager) cx.getSystemService(Context.ACTIVITY_SERVICE); 

public int findPIDbyPackageName(String packagename) { 
    int result = -1; 

    if (am != null) { 
     for (RunningAppProcessInfo pi : am.getRunningAppProcesses()){ 
      if (pi.processName.equalsIgnoreCase(packagename)) { 
       result = pi.pid; 
      } 
      if (result != -1) break; 
     } 
    } else { 
     result = -1; 
    } 

    return result; 
} 

दूसरा बेवकूफ करता है लेकिन मुझे अपनी परियोजना के लिए इसकी आवश्यकता है।

public boolean isPackageRunning(String packagename) { 
    return findPIDbyPackageName(packagename) != -1; 
} 

तीसरा काम करता है।

public boolean killPackageProcesses(String packagename) { 
    boolean result = false; 

    if (am != null) { 
     am.killBackgroundProcesses(packagename); 
     result = !isPackageRunning(packagename); 
    } else { 
     result = false; 
    } 

    return result; 
} 

वे एपीआई 15 के साथ एमुलेटर एपीआई 8 और 9 के साथ और एक वास्तविक डिवाइस (Galaxy S2) पर काम करने की पुष्टि की है और वे किसी भी आवेदन की प्रक्रियाओं (न केवल अपने स्वयं के) को मारने DO जब तक वे नहीं कर रहे हैं जरूरत है।

अब android.os.Process.killProcess प्रलेखन जिसमें कहा गया है कि के बारे में:

... आमतौर पर यह फोन करने वाले का पैकेज/आवेदन और उस ऐप्लिकेशन द्वारा बनाया गया कोई भी अतिरिक्त चल रही प्रक्रियाओं का मतलब केवल प्रक्रिया; ...

मुझे विश्वास है कि "प्रक्रिया फोन करने वाले का पैकेज/आवेदन चल रहा है" घर लांचर आवेदन का अर्थ है और नहीं अपने खुद के आवेदन। आपका आवेदन कॉलर है और कॉलर के पैकेज/एप्लिकेशन चलाने वाली प्रक्रिया होम लॉन्चर या कोई अन्य ऐप आपके एप्लिकेशन को लॉन्च करता है। मेरे लिए यह समझने का एकमात्र तरीका है कि killBackgroundProcesses फ़ंक्शन और android.os.Process.killProcess फ़ंक्शन वास्तव में तृतीय पक्ष अनुप्रयोगों पर काम कर रहे हैं।

+0

पूर्ण उत्तर के लिए धन्यवाद! –

+0

शानदार स्पष्टीकरण .. –

1

डॉक पर खड़े:

दिया पीआईडी ​​के साथ प्रक्रिया को मारने। ध्यान दें कि, हालांकि यह एपीआई हमें अपने पीआईडी ​​के आधार पर किसी भी प्रक्रिया को मारने का अनुरोध करने की अनुमति देता है, फिर भी कर्नेल मानक प्रतिबंध लगाएगा जिस पर आप वास्तव में मारने में सक्षम हैं। आम तौर पर इसका मतलब केवल कॉलर के पैकेज/एप्लिकेशन को चलाने वाली प्रक्रिया और उस ऐप द्वारा बनाई गई कोई भी अतिरिक्त प्रक्रिया है; एक सामान्य यूआईडी साझा करने वाले पैकेज भी एक-दूसरे की प्रक्रियाओं को मारने में सक्षम होंगे।

ताकि आप अपने प्रक्रिया को मार सकता है ..

Process दस्तावेज़ देखें। मैंने adb shell kill pid चलाने की कोशिश की लेकिन इसके लिए सुपर उपयोगकर्ता अनुमति

+0

मुझे पता है कि मैं अपनी प्रक्रियाओं को मार सकता हूं, मेरा सवाल यह है कि विदेशी प्रक्रिया को कैसे मारना है। –

+1

जहां तक ​​मुझे पता है कि आप नहीं कर सकते हैं, अगर आपके पास उस प्रक्रिया को मारने का अधिकार नहीं है – Blackbelt

+0

हाँ <विदेशी प्रक्रिया को कैसे मारना है? << – Criss

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