POC - 在没有活动的情况下启动时启动服务 - Android 4 +

时间:2015-11-11 00:05:04

标签: android android-service

这个问题可能看起来微不足道,但我一直在努力解决这个问题。

我尝试启动服务,如果我从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。

1 个答案:

答案 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命令来启动您的某个组件。这就是我能想到的一切。没有一个是通用的解决方案。

  

或通过创建与默认启动器活动同时启动的新活动(不可见?)

我不知道你认为会实现什么。如果用户启动了启动器活动,您已经处于停止状态,并将正常接收广播。