IT story

인 텐트의 모든 엑스트라 나열

hot-time 2020. 4. 15. 12:36
반응형

인 텐트의 모든 엑스트라 나열


디버깅 목적으로 인 텐트의 모든 엑스트라 (및 해당 값)를 나열하고 싶습니다. 이제 열쇠를 얻는 것은 문제가되지 않습니다

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

그러나 키의 값을 얻는 것은 나에게는 하나입니다. 일부 값은 문자열이고 일부는 부울입니다 ... 루프에서 값을 가져오고 (키를 반복하는) 값을 로그 파일에 쓰는 방법은 무엇입니까? 힌트 주셔서 감사합니다!


다음은 문서화되지 않은 (타사) 의도에 대한 정보를 얻는 데 사용한 것입니다.

Bundle bundle = intent.getExtras();
if (bundle != null) {
    for (String key : bundle.keySet()) {
        Log.e(TAG, key + " : " + (bundle.get(key) != null ? bundle.get(key) : "NULL"));
    }
}

data의도는 어디에 있습니까 ? bundle루프 전에 null 인지 확인하십시오 .


이것이 인 텐트의 모든 여분을 덤프하는 유틸리티 메소드를 정의하는 방법입니다.

import java.util.Iterator;
import java.util.Set;
import android.os.Bundle;


public static void dumpIntent(Intent i){

    Bundle bundle = i.getExtras();
    if (bundle != null) {
        Set<String> keys = bundle.keySet();
        Iterator<String> it = keys.iterator();
        Log.e(LOG_TAG,"Dumping Intent start");
        while (it.hasNext()) {
            String key = it.next();
            Log.e(LOG_TAG,"[" + key + "=" + bundle.get(key)+"]");
        }
        Log.e(LOG_TAG,"Dumping Intent end");
    }
}

한 줄의 코드로 할 수 있습니다.

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

다음과 같이 출력됩니다.

"#Intent; action = android.intent.action.MAIN; category = android.intent.category.LAUNCHER; launchFlags = 0x10a00000; component = com.mydomain.myapp / .StartActivity; sourceBounds = 12 % 20870 % 20276 % 201167; l .profile = 0; 끝 "

이 문자열의 끝에 (굵은 글씨로 표시 한 부분) 추가 목록 (이 예제에서는 하나만 추가)을 찾을 수 있습니다.

이것은 toUri 문서 에 따르면 "URI는 인 텐트의 데이터를 기본 URI로 포함하고 액션, 카테고리, 유형, 플래그, 패키지, 구성 요소 및 기타를 설명하는 추가 조각으로 구성됩니다."


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());
    }
}

번들의 get (String key) 메소드는 Object를 리턴합니다. 가장 좋은 방법은 각 키에서 get (String)을 호출하고 Object에서 toString ()을 사용하여 키 세트를 출력하는 것입니다. 이것은 프리미티브에 가장 효과적이지만 toString ()을 구현하지 않는 객체에 문제가 발생할 수 있습니다.


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

의도의 내용을 로그에 출력하고 쉽게 읽을 수있는 방법을 원했습니다. 그래서 여기에 생각해 냈습니다. LogUtil클래스를 만든 다음 dumpIntent()@Pratik이 만든 메서드를 가져와 조금 수정했습니다. 모든 모습은 다음과 같습니다.

public class LogUtil {

    private static final String TAG = "IntentDump";

    public static void dumpIntent(Intent i){
        Bundle bundle = i.getExtras();
        if (bundle != null) {
            Set<String> keys = bundle.keySet();

            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("IntentDump \n\r");
            stringBuilder.append("-------------------------------------------------------------\n\r");

            for (String key : keys) {
                stringBuilder.append(key).append("=").append(bundle.get(key)).append("\n\r");
            }

            stringBuilder.append("-------------------------------------------------------------\n\r");
            Log.i(TAG, stringBuilder.toString());
        }
    }
}

이것이 누군가를 돕기를 바랍니다!


당신이 사용할 수있는 for (String key : keys) { Object o = get(key);개체를 반환하는 호출 getClass().getName()유형을 얻기 위해 그 위에 한 다음 name.equals ( "문자열")를 입력 일들이 값을 얻기 위해, 당신이 실제로 호출해야하는 방법을 해결하는 경우의 집합을 ?


안드로이드 소스에서 거의 모든 작업으로 인해 번들이 데이터를 소포로 빼앗는 것으로 나타났습니다. 따라서 (나와 같이) 디버깅 목적 으로이 작업을 자주 수행 해야하는 경우 아래에 입력하는 것이 매우 빠릅니다.

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

이것이 너무 장황하거나 너무 늦다면 미안하지만, 이것이 내가 일을 끝내는 유일한 방법이었습니다. 가장 복잡한 요인은 java가 참조 함수를 통과하지 않았기 때문에 get --- Extra 메소드는 기본값을 반환해야하고 부울 값을 수정하여 기본값이 우연히 반환되는지 여부를 알 수 없다는 점입니다. 또는 결과가 좋지 않았기 때문입니다. 이를 위해 메소드가 기본값을 리턴하는 것보다 예외를 발생시키는 것이 더 좋을 것입니다.

내 정보는 Android Intent Documentation 에서 찾았습니다 .

    //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();
    }

Kotlin 버전의 Pratik 유틸리티 메소드 는 모든 추가 기능을 덤프합니다.

fun dumpIntent(intent: Intent) {

    val bundle: Bundle = intent.extras ?: return

    val keys = bundle.keySet()
    val it = keys.iterator()

    Log.d(TAG, "Dumping intent start")

    while (it.hasNext()) {
        val key = it.next()
        Log.d(TAG,"[" + key + "=" + bundle.get(key)+"]");
    }

    Log.d(TAG, "Dumping intent finish")

}

디버깅을 위해 원하는 것이 문자열 (OP에 의해 암시되지만 명시 적으로 명시되지 않은 정렬) 인 toString경우 extras 를 사용 하십시오 Bundle.

intent.getExtras().toString()

다음과 같은 문자열을 반환합니다.

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

문서 : Bundle.toString () (불행히도 기본 Object.toString()javadoc이며 여기서는 쓸모가 없습니다.)

참고 URL : https://stackoverflow.com/questions/5968896/listing-all-extras-of-an-intent

반응형