Android "Service Intent must be explicit"솔루션
3930 단어 Android 요약
은밀한 서비스 시작이 필요할 때 "서비스 Intent must be explicit"를 잘못 보고한 것을 발견하고 원본 코드를 보니 안드로이드 5.0 이후 구글에서 은밀한 서비스 시작을 금지합니다.소스는 다음과 같습니다.
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.Intent에 packageName을 설정하려면:
Intent intent = new Intent();
intent.setAction("com.richsoft.myservice");
intent.setPackage("com.richsoft.aidldemo");//Service
bindService(intent, connection, BIND_AUTO_CREATE);
2. 암시적 시작을 표시 시작으로 전환:
public static Intent getExplicitIntent(Context context, Intent implicitIntent) {
// Retrieve all services that can match the given intent
PackageManager pm = context.getPackageManager();
List 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 intent = new Intent(getExplicitIntent(mContext,mIntent));
context.startService(intent);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android "Service Intent must be explicit"솔루션Android 5.0 이후 "Service Intent must be explicit"해결 방법 은밀한 서비스 시작이 필요할 때 "서비스 Intent must be explicit"를 잘못 보고한 것을 발견하고 원본...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.