सबसे पहले, मुझे ध्यान रखना चाहिए कि यह आधिकारिक रूप से समर्थित नहीं है, हालांकि भविष्य में एंड्रॉइड में जोड़ा जाने वाला एक समर्थित तरीका हो सकता है (दोनों दावों के लिए स्रोत: दूसरे पैराग्राफ देखें this link)।
फिर, यह समर्थित नहीं है और बहुत संभवतः अस्थिर है। मैंने मुख्य रूप से यह प्रयोग करने के लिए यह प्रयोग किया कि यह संभव था या नहीं; यदि आप वास्तव में इस विधि को किसी एप्लिकेशन में शामिल करने की योजना बना रहे हैं तो अत्यधिक सावधानी बरतें।
हालांकि, यह अनुप्रयोगों के बीच वरीयताओं साझा करने के लिए अगर कुछ शर्तों के पूरा होने संभव प्रतीत होता है। सबसे पहले, यदि आप एप बी को ऐप ए की प्राथमिकताओं तक पहुंचने में सक्षम होना चाहते हैं तो ऐप बी का पैकेज नाम ऐप ए के पैकेज नाम का एक बच्चा होना चाहिए (उदा। ऐप ए: com.example.pkg
ऐप बी: com.example.pkg.stuff
)। इसके अतिरिक्त, वे एक ही समय में फ़ाइल तक पहुंच नहीं ले सकते हैं (मुझे लगता है कि समान नियम लागू होते हैं क्योंकि गतिविधियों के बीच उन्हें एक्सेस करने के लिए, यदि आप परमाणु पहुंच सुनिश्चित करना चाहते हैं तो आपको अतिरिक्त सुरक्षा जैसे कि .wait () और .notify(), लेकिन मैं उसमें नहीं जाऊंगा)।
नोट: यह सभी 2.2 और 2.3.3 पर एमुलेटर पर काम करता है- मैंने उपकरणों या एंड्रॉइड संस्करणों में बड़े पैमाने पर परीक्षण नहीं किया है।
हालात एप्लिकेशन जो (ऊपर की ओर से एप्लिकेशन ए) वरीयताओं ही जा रहा है में करने के लिए:)
1. घोषित SharedPreferences फ़ाइल
यह काफी सरल है । बस अपनी साझाpreferences फ़ाइल और अपनी कक्षा में संपादक के लिए कुछ चर घोषित करें और उन्हें अपने ऑनरेट विधि में तुरंत चालू करें। आप अब वरीयताओं में एक स्ट्रिंग डाल सकते हैं जिसका उपयोग आप यह सुनिश्चित करने के लिए करेंगे कि अन्य ऐप इसे ठीक से पढ़ सके।
public class stuff extends Activity {
SharedPreferences mPrefs = null;
SharedPreferences.Editor mEd= null;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mPrefs = (getApplicationContext()).getSharedPreferences("svcprefs", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
mEd = mPrefs.edit();
mEd.putString("test", "original send from prefs owner");
mEd.commit();
2.) बैकअप फ़ाइल getSharedPreferences विधि से प्राथमिकताएं लोड करने में एक .bak फ़ाइल के लिए जाँच करने के लिए प्रकट होता है सेट करें।यही कारण है कि यह प्रलेखन में कहता है कि यह कई प्रक्रियाओं में काम नहीं करेगा; I/O को कम करने के लिए, जब आप उन्हें पकड़ते हैं तो यह एक बार prefs लोड करता है और जब आप अपना एप्लिकेशन/गतिविधि बंद करते हैं तो केवल उन्हें वापस ले जाता है। हालांकि, अगर आप इसे किसी बाहरी एप्लिकेशन से कॉल करते हैं तो आपको फ़ोल्डर के लिए सही फ़ाइल अनुमतियां नहीं होने के बारे में चेतावनी मिलेगी (जो कि पहला ऐप का डेटा फ़ोल्डर है)। इसे ठीक करने के लिए हम खुद को .bak फ़ाइल बनाने जा रहे हैं और इसे सार्वजनिक रूप से पठनीय/लिखने योग्य बनाते हैं। जिस तरह से मैंने इसे चुना है वह मेरी समग्र कक्षा में तीन चर परिभाषित करना था।
final String[] copyToBackup = { "dd", "if=/data/data/com.example.pkg/shared_prefs/prefs.xml", "of=/data/data/com.example.pkg/shared_prefs/prefs.xml.bak", "bs=1024" };
final String[] mainFixPerm = {"chmod", "666", "/data/data/com.example.pkg/shared_prefs/prefs.xml"};
final String[] bakFixPerm = {"chmod", "666", "/data/data/com.example.pkg/shared_prefs/prefs.xml.bak"};
और अपने मुख्य वर्ग में एक समारोह जो तर्क के रूप में इन लेते हैं और उन्हें
public void execCommand(String[] arg0){
try {
final Process pr = Runtime.getRuntime().exec(arg0);
final int retval = pr.waitFor();
if (retval != 0) {
System.err.println("Error:" + retval);
}
}
catch (Exception e) {}
}
निष्पादित यह बहुत सुंदर या अच्छा नहीं है, लेकिन यह काम करता है होगा बनाते हैं। अब, आपके ऑनक्रेट विधि में (editor.commit() के ठीक बाद) आप इस फ़ंक्शन को तीनों तारों में से प्रत्येक के साथ कॉल करेंगे।
execCommand(copyToBackup);
execCommand(mainFixPerm);
execCommand(bakFixPerm);
इस फ़ाइल को कॉपी करें और दोनों मुख्य .xml और बाहर कार्यक्रमों के लिए सुलभ .xml.bak फ़ाइलों कर देगा। यह सुनिश्चित करने के लिए कि इन्हें आपके ऐप से बाहर निकलने पर डेटाबेस का बैक अप ठीक से बैक अप किया गया है, और अतिरिक्त रूप से उन्हें कॉल करने से पहले उन्हें सही तरीके से कॉल करें (अन्यथा यह .bak फ़ाइल लोड करेगा यदि कोई अन्य प्रक्रिया मुख्य .xml फ़ाइल को संपादित कर रही है तो संभवतः पुराना है)। हालांकि, इस एप्लिकेशन में आपको बस इतना करना है। आप इस गतिविधि में कहीं और getSharedPreferences को कॉल कर सकते हैं और यह .xml फ़ाइल से सभी डेटा ले जाएगा, जिससे आप getdatatype ("key") विधियों को कॉल कर सकते हैं और इसे पुनर्प्राप्त कर सकते हैं।
चीजें (ऊपर की ओर से एप्लिकेशन बी) एक्सेस फ़ाइल (फ़ाइलें) में करने के लिए
1.) फ़ाइल
लिखें यह भी सरल है। मैंने इस गतिविधि पर एक बटन बनाया और इसके ऑनक्लिक विधि में कोड सेट किया जो साझा प्राथमिकता फ़ाइल में कुछ सहेज लेगा। याद रखें कि ऐप बी का पैकेज ऐप ए के पैकेज का बच्चा होना चाहिए। हम ऐप ए के संदर्भ के आधार पर एक संदर्भ तैयार करेंगे और फिर उस संदर्भ पर getSharedPreferences को कॉल करेंगे।
prefsbutton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Context myContext = null;
try {
// App A's context
myContext = createPackageContext("com.example.pkg", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
} catch (NameNotFoundException e) {e.printStackTrace();}
testPrefs = myContext.getSharedPreferences("svcprefs", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
testEd = testPrefs.edit();
String valueFromPrefs = testPrefs.getString("test", "read failure");
TextView test1 = (TextView)findViewById(R.id.tvprefs);
test1.setText(valueFromPrefs);
testEd.putString("test2", "testback");
boolean edit_success = testEd.commit();
इस स्ट्रिंग मैं अन्य अनुप्रयोग में सेट पकड़ लेता है और इस आवेदन में एक TextView में यह (या एक त्रुटि संदेश) प्रदर्शित करता है। इसके अतिरिक्त यह प्राथमिकता फ़ाइल में एक नई स्ट्रिंग सेट करता है और परिवर्तन करता है। इस रन के बाद, यदि आपका अन्य एप्लिकेशन कॉल शेर किया गया है, तो यह इस ऐप के परिवर्तन सहित फ़ाइल को पुनर्प्राप्त करेगा।
क्यों, जब आप कहते हैं कि ये हमेशा एक साथ स्थापित होते हैं, तो क्या इन्हें दो अलग-अलग ऐप्स होने की आवश्यकता है? बहुत सारे सिरदर्द की तरह लगता है, इसलिए संभवतः आप एक लाभ की कल्पना कर रहे हैं, लेकिन मुझे आश्चर्य है कि वास्तव में अलग-अलग ऐप्स होने के बिना इसे प्राप्त करने का कोई तरीका हो सकता है। –
मैं दोनों ऐप्स इंस्टॉल करने, वरीयताओं को सेट करने में सक्षम होना चाहता था, और उसके बाद फ्रंटएंड यूआई को अनइंस्टॉल करना चाहता था लेकिन सेवा को पृष्ठभूमि में जाने देना था। यह मुझे दोबारा इंस्टॉल किए बिना एक ऐप को अपग्रेड करने की अनुमति देता है। यह निश्चित रूप से _necessary_ नहीं है (और मैं इसका भी उपयोग नहीं कर सकता) लेकिन यह मेरे द्वारा डिजाइन किए जाने के तरीके को लागू करने के लिए मेरे विचारों में से एक था। – matt5784