在停止的应用程序中接收广播
Receive broadcasts in stopped application
默认情况下,处于停止状态(尚未运行一次)的应用程序无法接收广播。如果我们将标志FLAG_INCLUDE_STOPPED_PACKAGES
添加到广播意图中,就有一种方法可以接收它。
我的问题是我需要接收系统意图 android.intent.action.MEDIA_MOUNTED
(我不想向其添加该标志)。
如何在停止的应用程序中接收它?
在我看来这肯定是可能的,因为例如 com.android.shell
应用程序即使被强制停止也能够接收到这样的意图。它是怎么做到的?
编辑:
澄清一下,因为这似乎并不明显:
此处的所有内容均来自 Android 开源项目开发人员的观点。我正在修改操作系统源代码,我想接收广播的应用程序可以预装、使用平台证书签名、可以使用隐藏 API 等。一切都是允许的,甚至是对系统的修改。
将您的应用程序声明为系统应用程序应该允许您接收定期广播,即使您的应用程序处于“停止状态”。
将以下内容添加到您的清单中,并确保您的应用程序由平台密钥签名:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...
...
android:sharedUserId="android.uid.system">
如果您使用的是 root 设备,您可以使用 Xposed 修改 android.content.Intent#isExcludingStopped,如下所示:
public class DontExcludeStoppedPackagesFromIntents implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (lpparam.packageName.equals("android")) {
XposedBridge.log("In package: " + lpparam.packageName);
findAndHookMethod("android.content.Intent", lpparam.classLoader, "isExcludingStopped", new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
return false;
}
});
}
}
}
不要忘记将 class 名称放入 xposed_init。
当然,这有一些安全隐患,有效地将您带回到 Android 3.0-,尽管这应该不是什么大问题,因为没有人希望利用几乎所有现有 Android 未应用此补丁的设备。
我试过上面的方法,很有效!
如果您不是指强制停止的应用程序,而是指处于停止状态的已关闭应用程序,请查看这两个链接可了解如何实现可在应用程序关闭后激活的 BroadcastReceiver。否则自定义 ROM 和/或 sys 应用程序可能是可行的方法。
BroadcastReceiver 2
默认情况下,处于停止状态(尚未运行一次)的应用程序无法接收广播。如果我们将标志FLAG_INCLUDE_STOPPED_PACKAGES
添加到广播意图中,就有一种方法可以接收它。
我的问题是我需要接收系统意图 android.intent.action.MEDIA_MOUNTED
(我不想向其添加该标志)。
如何在停止的应用程序中接收它?
在我看来这肯定是可能的,因为例如 com.android.shell
应用程序即使被强制停止也能够接收到这样的意图。它是怎么做到的?
编辑:
澄清一下,因为这似乎并不明显:
此处的所有内容均来自 Android 开源项目开发人员的观点。我正在修改操作系统源代码,我想接收广播的应用程序可以预装、使用平台证书签名、可以使用隐藏 API 等。一切都是允许的,甚至是对系统的修改。
将您的应用程序声明为系统应用程序应该允许您接收定期广播,即使您的应用程序处于“停止状态”。
将以下内容添加到您的清单中,并确保您的应用程序由平台密钥签名:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...
...
android:sharedUserId="android.uid.system">
如果您使用的是 root 设备,您可以使用 Xposed 修改 android.content.Intent#isExcludingStopped,如下所示:
public class DontExcludeStoppedPackagesFromIntents implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (lpparam.packageName.equals("android")) {
XposedBridge.log("In package: " + lpparam.packageName);
findAndHookMethod("android.content.Intent", lpparam.classLoader, "isExcludingStopped", new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
return false;
}
});
}
}
}
不要忘记将 class 名称放入 xposed_init。 当然,这有一些安全隐患,有效地将您带回到 Android 3.0-,尽管这应该不是什么大问题,因为没有人希望利用几乎所有现有 Android 未应用此补丁的设备。
我试过上面的方法,很有效!
如果您不是指强制停止的应用程序,而是指处于停止状态的已关闭应用程序,请查看这两个链接可了解如何实现可在应用程序关闭后激活的 BroadcastReceiver。否则自定义 ROM 和/或 sys 应用程序可能是可行的方法。
BroadcastReceiver 2