私は、アプリケーションのパッケージに含まれているサービスを使用するアプリケーションを持っています。インテントを処理するサービスを選択する方法
私は今、新しいバージョンの同じサービスを使用して、独自のアプリケーションパッケージ内にバンドルされた新しいアプリケーションを作成しています。
デバイスにインストールされているアプリが1つだけの場合は正常です。しかし、両方のアプリがデバイスにインストールされている場合は、最も古いものがインストールされていないもの、つまり最も古いパッケージのサービスを使用します。 1)古いサービスが新しい呼び出しを処理しない(明らかに) 2)他のアプリケーションにバンドルされているサービスを使用すると、そのサービスは自分の代わりにその他のアプリケーションの保存されたデータを使用して終了します。
短期間では、私は実際にはそれぞれのアプリケーションが独自のバージョンのサービスと対話したいと思っています。それぞれのバンドルされたサービスを一意の意図に対応させずに、各アプリケーションがそのユニークな意図を使用することなく、これを行うことは可能ですか?
長期的には、オプションで両方のアプリケーションが最新のバージョンのサービスと対話してデータを共有し、いずれかのアプリケーションがアンインストールされていてもうまくいくのは良いことです。それを行う正しい方法は何ですか?データは主にSQLiteデータベースに格納され、Context.getDatabasePath()
が指定されています。もちろんアプリケーション固有であり、アプリケーションがアンインストールされている場合は消去されます。
を、私はサービスの両方のバージョンでResolveInfoのリストを取得するにはPackageManager.queryIntentServices()
を使用することができます。ここでは
は、私がこれまで試したものです。 ResolveInfo.serviceInfo.applicationInfo.packageName
を見ると、どちらがどちらであるかわかります。しかし、そのResolveInfoを使用して、2つのサービスのどちらを意図したいのかを指定する方法はありません。それのpackageNameは私が一致させたいものと同じであるよう
serviceIntent.setPackage(context.getApplicationContext().getApplicationInfo().packageName);
:
これは、それが正しいことを行う必要があるように思えます。実際、queryIntentServices
に変更されたインテントを呼び出すと、私のパッケージ内のサービスだけを含むリストが返されます。しかし、そのインテントでbindServiceを試みると、セキュリティ例外がスローされます。いくつかのグーグルに基づいて
java.lang.RuntimeException: Unable to bind to service [email protected] with Intent { act=my.intent.string pkg=my.app.package.name }: java.lang.SecurityException: Not allowed to start service Intent { act=RuntimeException: Unable to bind to service my.service.package.name.MyServiceClass } without permission private to package
、私も行って、意図作成しようとしている:すべてのいずれかのサービスに解決されません
Intent serviceIntent = new Intent().setClassName(
"my.service.package.name",
"my.service.package.name.ServiceClassName");
を。
また、AndroidManifest.xmlのサービスエントリ内のandroid:exported=
をtrue、false、または指定しないで、両方のアプリケーションでさまざまな組み合わせで変更してみましたが、無駄です。 (私はそれらを両方ともfalseに設定すると、各アプリケーションはサービスのコピーを見ることしかできないことを期待していました)。
私は上記の試みの1つに問題を認識しました。 'Intent.setClassName()'アプローチの場合は、次のようになります。 'serviceIntent = new Intent()。setClassName( context.getApplicationContext()。getApplicationInfo()。packageName、 " my.service.package.name .ServiceClassName ");' 正しいサービスであるが、サービスをバインドしようとするが、 'Intent.setPackage()'と同じセキュリティ例外がスローされる。 – benkc