Android11:启动另一个应用的服务
Android 11: starting a service of another app
第一个应用有服务:
<service
android:name="com.example.app.service.MyService"
android:exported="true">
<intent-filter>
<action android:name="com.example.app.START_MY_SERVICE" />
</intent-filter>
</service>
另一个应用使用(3 种可能的方法)启动第一个应用的服务:
1:
val i = Intent("com.example.app.START_MY_SERVICE").apply {
setPackage("com.example.app")
}
startService(i)
2:
val i = Intent().apply {
component = ComponentName("com.example.app", "com.example.app.service.MyService")
}
startService(i)
3:
val i = Intent().apply {
setClassName("com.example.app", "com.example.app.service.MyService")
}
startService(i)
所有这些启动另一个应用程序服务的方法从 23 API (6 Android) 到 29 API (10 Android)
在Android11(30API)上不行,一个服务不启动,无一例外:
当使用 2-3 种方法时,在 Logcat 中打印:
W/ActivityManager: Unable to start service Intent { cmp=com.example.app.service/.service.MyService } U=0: not found
对于 1 种方法,什么都没有发生,在 Logcat
没有消息
那么我们如何在 Android 11 上从另一个应用程序启动某个应用程序的服务?
启动另一个应用程序服务的应用程序必须在清单中包含下一个声明:
<queries>
<package android:name="com.example.anotherapp" />
</queries>
或
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
(Automate 和 Tasker 等应用程序有此权限)
感谢 CommonsWare
我也在寻找如何打开 exprnal 应用程序,当我无法获得信息时,这个应用程序是否安装在 phone 上。您可以尝试 startActivity() 并处理 ActivityNotFoundException,如果它存在,则意味着应用程序未安装在 phone 上或无法打开这样的链接。还有一些意图标志,如果意图启动浏览器或选择 activity 对话框,也可以使 ActivityNotFoundException:FLAG_ACTIVITY_REQUIRE_NON_BROWSER、FLAG_ACTIVITY_REQUIRE_DEFAULT
这里是关于这个案例的更多官方信息和其他信息:
在 Android 中打开外部应用程序:
https://developer.android.com/training/package-visibility/use-cases
https://developer.android.com/training/package-visibility
https://developer.android.com/training/basics/intents
告诉我们什么时候可以使用 QUERY_ALL_PACKAGES 权限:
https://support.google.com/googleplay/android-developer/answer/10158779
https://developer.android.com/training/package-visibility/use-cases
https://medium.com/androiddevelopers/package-visibility-in-android-11-cc857f221cd9
https://pretagteam.com/question/android-11-sdk-30-launch-external-app-doesnt-work
第一个应用有服务:
<service
android:name="com.example.app.service.MyService"
android:exported="true">
<intent-filter>
<action android:name="com.example.app.START_MY_SERVICE" />
</intent-filter>
</service>
另一个应用使用(3 种可能的方法)启动第一个应用的服务:
1:
val i = Intent("com.example.app.START_MY_SERVICE").apply {
setPackage("com.example.app")
}
startService(i)
2:
val i = Intent().apply {
component = ComponentName("com.example.app", "com.example.app.service.MyService")
}
startService(i)
3:
val i = Intent().apply {
setClassName("com.example.app", "com.example.app.service.MyService")
}
startService(i)
所有这些启动另一个应用程序服务的方法从 23 API (6 Android) 到 29 API (10 Android)
在Android11(30API)上不行,一个服务不启动,无一例外:
当使用 2-3 种方法时,在 Logcat 中打印:
W/ActivityManager: Unable to start service Intent { cmp=com.example.app.service/.service.MyService } U=0: not found
对于 1 种方法,什么都没有发生,在 Logcat
没有消息那么我们如何在 Android 11 上从另一个应用程序启动某个应用程序的服务?
启动另一个应用程序服务的应用程序必须在清单中包含下一个声明:
<queries>
<package android:name="com.example.anotherapp" />
</queries>
或
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
(Automate 和 Tasker 等应用程序有此权限)
感谢 CommonsWare
我也在寻找如何打开 exprnal 应用程序,当我无法获得信息时,这个应用程序是否安装在 phone 上。您可以尝试 startActivity() 并处理 ActivityNotFoundException,如果它存在,则意味着应用程序未安装在 phone 上或无法打开这样的链接。还有一些意图标志,如果意图启动浏览器或选择 activity 对话框,也可以使 ActivityNotFoundException:FLAG_ACTIVITY_REQUIRE_NON_BROWSER、FLAG_ACTIVITY_REQUIRE_DEFAULT
这里是关于这个案例的更多官方信息和其他信息:
在 Android 中打开外部应用程序:
https://developer.android.com/training/package-visibility/use-cases
https://developer.android.com/training/package-visibility
https://developer.android.com/training/basics/intents
告诉我们什么时候可以使用 QUERY_ALL_PACKAGES 权限: https://support.google.com/googleplay/android-developer/answer/10158779
https://developer.android.com/training/package-visibility/use-cases
https://medium.com/androiddevelopers/package-visibility-in-android-11-cc857f221cd9
https://pretagteam.com/question/android-11-sdk-30-launch-external-app-doesnt-work