这个问题可能看起来微不足道,但我一直在努力解决这个问题。
我尝试启动服务,如果我从mainActivity
(启动活动)开始至少一次,一切正常,例如:
的AndroidManifest.xml
...
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
<activity
android:name="com.example.mainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.example.bootReceiver" android:enabled="true" android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
<service android:name="com.example.someService" android:enabled="true" android:exported="false"/>
...
bootReceiver.java
...
startService(new Intent(getApplicationContext(), com.example.someService.class));
...
mainActivity.java
...
startService(new Intent(getApplicationContext(), com.example.someService.class));
...
使用上面的代码,我可以在每次启动后运行服务而没有任何问题。
作为 POC ,我尝试启动没有任何活动的服务,或者至少没有mainActivity
,只需声明AndroidManifest.xml
上的服务或通过创建与默认启动器活动同时启动的新活动(不可见?)。
据我所知,由于安全原因,这在Android 3+(4+?)上是不可能的。
有没有办法实现这个目标?
我可以在用户启动应用时从 AndroiManifest.xml
开始2个活动吗?
对不起,如果我的问题没有100%明确,我已尽力解释,如果您无法理解,请在下面发表评论。 TKS。
答案 0 :(得分:2)
据我所知,由于安全原因,这在Android 3+(4+?)上是不可能的。
Android 3.1,实际上是为了帮助防止偷渡式恶意软件。
有没有办法实现这个目标?
必须使用显式Intent
在您的某个组件上调用某种形式的IPC,以将应用程序移出所谓的“停止状态”#34;这会阻止您接收广播。所以,有些事情需要:
Intent
或Intent
或Intent
(我不知道尝试连接到ContentProvider
是否有效,但可以说它应该有效)
关键是明确的Intent
。这就是为什么从主屏幕启动器调用活动的原因,因为用于启动活动的Intent
将是一个明确的活动。
但是,如果没有这样的活动,您需要找到其他可以使用显式Intent
来调用其中一个组件的内容。如果用户通过系统设置应用程序激活该应用程序的功能,则某些专门服务(例如,输入方法)可能会使用显式Intent
进行调用。如果您是某个其他应用的插件,那么其他应用可能会使用明确的Intent
来处理您的某个组件。您可以要求用户安装Android SDK,了解如何使用命令行,并调用adb shell am
命令来启动您的某个组件。这就是我能想到的一切。没有一个是通用的解决方案。
或通过创建与默认启动器活动同时启动的新活动(不可见?)
我不知道你认为会实现什么。如果用户启动了启动器活动,您已经处于停止状态,并将正常接收广播。