我正在创建一个应用程序,其唯一的组件是service继续在后台运行(基本上是代理服务器),但我无法找到如何启动该服务的方法.应用程序无法进行任何UI或用户交互,因此我不使用Activity.
Broadcast receiver可以收听BOOT广播,但如何在安装时首次启动服务,如何让它保持运行?或者是否有安装应用程序后我可以收听的广播,例如可能是TIME_TICK,但必须从我认为的活动中注册.
背景技术
我有一个具有多个活动的任务(即app).
问题
如何将任务放在前面而没有为该任务重新排序活动堆栈?
USER SCENARIO
当设备启动时(即收到android.intent.action.BOOT_COMPLETED广播后),我的应用程序启动,调用此任务1,并显示活动A(下面的代码).当用户与任务1交互时,他/她在堆栈上打开活动B(活动B现在当前显示在屏幕上).接下来,用户点击主页键并打开其他任务,将其命名为任务2,然后锁定屏幕.用户解锁屏幕,我的应用程序广播并接收android.intent.action.USER_PRESENT意图(请参阅下面的清单摘录).我按照预期在我的IntentReceiver类中执行startActivity()调用,但不是仅将任务带到前台,而是创建一个新任务,称之为任务3.
我已经尝试过的
更改如果我将Intent.FLAG_ACTIVITY_NEW_TASK修改或更改为任何其他意图,那么我会收到以下错误消息:
从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志.这真的是你想要的吗?
...所以看起来我必须使用Intent.FLAG_ACTIVITY_NEW_TASK.
如果我将主活动的lauchMode更改为"singleTask",则将正确的任务置于前台(即不创建新任务),但重新排序活动堆栈以使activity_A位于堆栈顶部.
在这一点上,我不知道如何将现有任务带到前台,而不是在监听android.intent.action.USER_PRESENT意图时重新排序活动堆栈,任何帮助都将不胜感激.
顺便说一句,这个应用程序正在公司拥有的Android设备上交付给一组员工,而不是一般公众.
CODE SNIPPETS
要启动应用程序,我在清单文件中设置了广播接收器.
<application
:
<activity
android:label="@string/app_name"
android:launchMode="singleTop"
android:name=".activities.activity_A" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
:
<receiver
android:enabled="true"
android:name=".utilities.IntentReceiver"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
在我的IntentReceiver类中,我开始我的主要活动......
public class IntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, activity_A.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
} …Run Code Online (Sandbox Code Playgroud)