Android 에 나타 난 경고(Service Intent must be explicit)해결 방법 상세 설명

Android 에 나타 난 경고(Service Intent must be explicit)해결 방법 상세 설명
어떤 때 는 우리 가 서 비 스 를 사용 할 때 프라이버시 시작 방식 을 사용 해 야 하지만 안 드 로 이 드 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 과 packageName 설정:
참조 코드 는 다음 과 같 습 니 다.

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);
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기