android - एक इरादे के सभी अतिरिक्त लिस्टिंग




android-intent (8)

डिबगिंग कारणों के लिए मैं एक इरादे के सभी अतिरिक्त (और उनके मूल्य) सूचीबद्ध करना चाहता हूं। अब, चाबियाँ प्राप्त करना कोई समस्या नहीं है

Set<String> keys = intent.getExtras().keySet();

लेकिन चाबियों के मान प्राप्त करना मेरे लिए एक है, क्योंकि कुछ मूल्य स्ट्रिंग हैं, कुछ बुलियन हैं ... मैं लूप में मान कैसे प्राप्त कर सकता हूं (चाबियों के माध्यम से लूपिंग) और मान को लॉगफाइल पर लिख सकते हैं? किसी भी संकेत के लिए धन्यवाद!


आप for (String key : keys) { Object o = get(key); उपयोग कर सकते हैं for (String key : keys) { Object o = get(key); ऑब्जेक्ट को वापस करने के लिए, getClass().getName() को टाइप प्राप्त करने के लिए कॉल करें, और फिर if.equals ("स्ट्रिंग") का एक सेट करें, यह काम करने के लिए टाइप करें कि आपको किस विधि को वास्तव में कॉल करना चाहिए, क्रम में मूल्य प्राप्त करने के लिए?


आप इसे कोड की एक पंक्ति में कर सकते हैं:

Log.d("intent URI", intent.toUri(0));

यह कुछ ऐसा आउटपुट करता है:

"# इंन्टेंट; एक्शन = android.intent.action.MAIN; श्रेणी = android.intent.category.LAUNCHER; लॉन्चफ्लैग = 0x10a00000; घटक = com.mydomain.myapp / .SartartActivity; स्रोतबाउंड = 12% 20870% 20276% 201167; एल .profile = 0; अंत "

इस स्ट्रिंग के अंत में (जिस भाग को मैंने बोल्ड किया था) आप अतिरिक्त की सूची पा सकते हैं (इस उदाहरण में केवल एक अतिरिक्त)।

यह यूआरआई दस्तावेज के मुताबिक है : "यूआरआई में उद्देश्य यूआरआई के रूप में इरादा का डेटा होता है, जिसमें कार्रवाई, श्रेणियां, प्रकार, झंडे, पैकेज, घटक और अतिरिक्त वर्णों का एक अतिरिक्त खंड होता है।"


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

मुझे यहां मेरी जानकारी मिली: एंड्रॉइड आशय दस्तावेज़ीकरण

    //substitute your own intent here
    Intent intent = new Intent();
    intent.putExtra("first", "hello");
    intent.putExtra("second", 1);
    intent.putExtra("third", true);
    intent.putExtra("fourth", 1.01);
    // convert the set to a string array

दस्तावेज़ीकरण सेट करें

    String[] anArray = {};
    Set<String> extras1 = (Set<String>) intent.getExtras().keySet();
    String[] extras = (String[]) extras1.toArray(anArray);
    // an arraylist to hold all of the strings
    // rather than putting strings in here, you could display them
    ArrayList<String> endResult = new ArrayList<String>();
    for (int i=0; i<extras.length; i++) {
        //try using as a String
        String aString = intent.getStringExtra(extras[i]);
        // is a string, because the default return value for a non-string is null
        if (aString != null) {
            endResult.add(extras[i] + " : " + aString);
        }
        // not a string
        else {
            // try the next data type, int
            int anInt = intent.getIntExtra(extras[i], 0);
            // is the default value signifying that either it is not an int or that it happens to be 0 
            if (anInt == 0) {
                // is an int value that happens to be 0, the same as the default value
                if (intent.getIntExtra(extras[i], 1) != 1) {
                    endResult.add(extras[i] + " : " + Integer.toString(anInt));
                }
                // not an int value
                // try double (also works for float)
                else {
                    double aDouble = intent.getDoubleExtra(extras[i], 0.0);
                    // is the same as the default value, but does not necessarily mean that it is not double
                    if (aDouble == 0.0) {
                        // just happens that it was 0.0 and is a double
                        if (intent.getDoubleExtra(extras[i], 1.0) != 1.0) {
                            endResult.add(extras[i] + " : " + Double.toString(aDouble));
                        }
                        // keep looking...
                        else {
                            // lastly check for boolean
                            boolean aBool = intent.getBooleanExtra(extras[i], false);
                            // same as default, but not necessarily not a bool (still could be a bool)
                            if (aBool == false) {
                                // it is a bool!
                                if (intent.getBooleanExtra(extras[i], true) != true) {
                                    endResult.add(extras[i] + " : " + Boolean.toString(aBool));
                                }
                                else {
                                    //well, the road ends here unless you want to add some more data types
                                }
                            }
                            // it is a bool
                            else {
                                endResult.add(extras[i] + " : " + Boolean.toString(aBool));
                            }
                        }
                    }
                    // is a double
                    else {
                        endResult.add(extras[i] + " : " + Double.toString(aDouble));
                    }
                }
            }
            // is an int value
            else {
                endResult.add(extras[i] + " : " + Integer.toString(anInt));
            }
        }
    }
    // to display at the end
    for (int i=0; i<endResult.size(); i++) {
        Toast.makeText(this, endResult.get(i), Toast.LENGTH_SHORT).show();
    }

बंडल की प्राप्त (स्ट्रिंग कुंजी) विधि ऑब्जेक्ट लौटाती है। आपकी सबसे अच्छी शर्त प्रत्येक कुंजी पर कुंजी सेट कॉलिंग (स्ट्रिंग) पर ऑब्जेक्ट करने के लिए ऑब्जेक्ट पर कुंजी स्ट्रिंग कॉलिंग (स्ट्रिंग) पर स्पिन करना है। यह प्राइमेटिव के लिए सबसे अच्छा काम करेगा, लेकिन आप ऑब्जेक्ट्स के साथ समस्याओं में भाग ले सकते हैं जो toString () को लागू नहीं करते हैं।


मैंने एंड्रॉइड स्रोत में देखा कि लगभग हर ऑपरेशन बंडल को अपने डेटा को बेकार करने के लिए मजबूर करता है। तो अगर (मुझे पसंद है) आपको इसे अक्सर डिबगिंग उद्देश्यों के लिए करने की ज़रूरत है, तो नीचे टाइप करने के लिए बहुत तेज़ है:

Bundle extras = getIntent().getExtras();
extras.isEmpty(); // unparcel
System.out.println(extras);

यदि आप चाहते हैं कि डिबगिंग के लिए एक स्ट्रिंग है (ओपी द्वारा निहित प्रकार का लेकिन स्पष्ट रूप से नहीं बताया गया है), बस अतिरिक्त Bundle पर स्ट्रिंग का उपयोग करें:

intent.getExtras().toString()

यह एक स्ट्रिंग देता है जैसे कि:

Bundle[{key1=value1, key2=value2, key3=value3}]

प्रलेखन: Bundle.toString() (दुर्भाग्य से यह डिफ़ॉल्ट Object.toString() javadoc और यहां तक ​​कि काफी बेकार है।)


Bundle extras = getIntent().getExtras();
Set<String> ks = extras.keySet();
Iterator<String> iterator = ks.iterator();
while (iterator.hasNext()) {
    Log.d("KEY", iterator.next());
}

private TextView tv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    tv = new TextView(this);
    tv.setText("Extras: \n\r");

    setContentView(tv);

    StringBuilder str = new StringBuilder();
    Bundle bundle = getIntent().getExtras();
    if (bundle != null) {
        Set<String> keys = bundle.keySet();
        Iterator<String> it = keys.iterator();
        while (it.hasNext()) {
            String key = it.next();
            str.append(key);
            str.append(":");
            str.append(bundle.get(key));
            str.append("\n\r");
        }
        tv.setText(str.toString());
    }
}




android-intent