Android5.0暗黙的起動サービス

2906 ワード

Android 5.0では暗黙的な意図でサービスを起動することは禁止されていますが、暗黙的な意図で起動すると異常が報告されるため、明示的な意図でサービスを起動する必要があります.起動するサービスが本アプリケーションであれば、明示的な意図で起動することもできますが、他のアプリケーションのサービスを起動する場合は、どのように明示的な意図で起動しますか?Android 5.0以前の携帯電話のインストールは暗黙的に起動しようとするサービスに関連しており、問題は発生せず、5.0以降の主流の携帯電話で発生した問題である.暗黙的な意図は異常を報告し、appが崩壊し、他のアプリケーションの起動が本アプリケーション内にないサービスがどのように明示的な意図で起動するかを解決する.
1つの暗黙的な意図を明示的な意図に変換するだけです.1つ目はcompontentコンポーネントを設定します.
public class ExplicitIntentUtil {

    public static Intent getExplicitIntent(Context context, Intent implicitIntent) {

        PackageManager pm = context.getPackageManager(); //       。

        //         ResolveInfo  ,    service.
        List<ResolveInfo> info = pm.queryIntentServices(implicitIntent, 0);
        //                 。
        if (info == null || info.size() != 1) {

            return null;
        }
        //         ServiceInfo.

        ResolveInfo resolveInfo = info.get(0);

        String packageName = resolveInfo.serviceInfo.packageName;

        String className = resolveInfo.serviceInfo.name;
        //  Service   ,     Component  。
        ComponentName componentName = new ComponentName(packageName, className);

        Intent  explicitIntent = new Intent(implicitIntent);

        explicitIntent.setComponent(componentName);

        return explicitIntent;
    }

}
Intent bindIntent = new Intent("com.example.servicedemo.DemoAIDL");
Intent explicitIntent = ExplicitIntentUtil.getExplicitIntent(MainActivity.this, bindIntent);
bindService(bindIntent, conn, BIND_AUTO_CREATE);

2つ目の方法:
サービスのパッケージ名がわかる場合:
Intent bindIntent = new Intent("com.example.servicedemo.DemoAIDL");
bindIntent.setPackage("com.example.servicedemo");
bindService(bindIntent, conn, BIND_AUTO_CREATE);