Android 5.0 에 나타 난 경고 해결: Service Intent must be explicit

5376 단어 android
extends:http://www.eoeandroid.com/thread-568853-1-1.html
 
이 게시 물 은 마지막 으로 469874851 에서 2015 - 3 - 11 18: 15 편집 되 었 습 니 다. 가끔 은 저희 가 서 비 스 를 사용 할 때 프라이버시 로 시작 해 야 하 는데 안 드 로 이 드 5.0 이 나 오 자마자 Service Intent 라 는 특성 이 있 습 니 다.  must be explitict, 즉 Lollipop 부터 service 서 비 스 는 디 스 플레이 방식 으로 시작 해 야 한 다 는 것 이다.안 드 로 이 드 소스 코드 는 이렇게 쓰 여 있 습 니 다 (소스 위치: sdk / sources / android - 21 / android / app / contextImpl. 자바):
private void validateServiceIntent(Intent service) {

        if (service.getComponent() == null && service.getPackage() == null) {

            if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP) {

                IllegalArgumentException ex = new IllegalArgumentException(

                        "Service Intent must be explicit: " + service);

                throw ex;

            } else {

                Log.w(TAG, "Implicit intents with startService are not safe: " + service

                        + " " + Debug.getCallers(2, 3));

            }

        }

    }

 
원본 코드 에 이렇게 쓰 여 있 는 이상 두 가지 해결 방법 이 있 습 니 다. 1. Action 과 package Name: 참고 코드 는 다음 과 같 습 니 다.
Intent mIntent = new Intent();

mIntent.setAction("XXX.XXX.XXX");//    service action

mIntent.setPackage(getPackageName());//             

context.startService(mIntent);

  이 방식 은 구 글 이 공식 적 으로 추천 하 는 해결 방법 이다.여기 주 소 를 참고 하 시기 바 랍 니 다. http://developer.android.com/goo ... tml#billing-service 관심 있 는 것 은 가 보 셔 도 됩 니 다.2. 암시 적 시작 을 디 스 플레이 시작 으로 변환 합 니 다. - 참고 주소: http://stackoverflow.com/a/26318757/1446466
public static Intent getExplicitIntent(Context context, Intent implicitIntent) {

        // Retrieve all services that can match the given intent

        PackageManager pm = context.getPackageManager();

        List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0);

        // Make sure only one match was found

        if (resolveInfo == null || resolveInfo.size() != 1) {

            return null;

        }

        // Get component info and create ComponentName

        ResolveInfo serviceInfo = resolveInfo.get(0);

        String packageName = serviceInfo.serviceInfo.packageName;

        String className = serviceInfo.serviceInfo.name;

        ComponentName component = new ComponentName(packageName, className);

        // Create a new intent. Use the old one for extras and such reuse

        Intent explicitIntent = new Intent(implicitIntent);

        // Set the component to be explicit

        explicitIntent.setComponent(component);

        return explicitIntent;

    } 

  호출 방식 은 다음 과 같 습 니 다.
Intent mIntent = new Intent();

mIntent.setAction("XXX.XXX.XXX");

Intent eintent = new Intent(getExplicitIntent(mContext,mIntent));

context.startService(eintent);

 

좋은 웹페이지 즐겨찾기