我正在设计一个基本上只是服务的应用程序。
它没有MainActivity ......只是一个BroadcastReceiver和一个服务。每次构建和安装时,都没有任何反应。广播接收器检测电话是否连接到WiFi网络。如果未连接WiFi,则会停止Service(),否则为startService()。
该服务将检查Pebble app消息并在消息接收时执行某些命令。问题是如果没有MainActivity,我就无法启动该服务。
可能因为我没有MainActivity
吗?
答案 0 :(得分:2)
简单后台应用程序在Android 3.0版本之后停止工作。
从Android 3.1开始,系统的包管理器会跟踪处于停止状态的应用程序,并提供从后台进程和其他应用程序控制其启动的方法。
系统将FLAG_EXCLUDE_STOPPED_PACKAGES
添加到所有广播意图。这样做是为了防止来自后台服务的广播无意或不必要地启动已停止应用程序的组件。更多信息Launch controls on stopped applications。
正如您所提到的,您只有一个BroadcastReceiver
和一个Service
而没有Activity
因此问题可能是您的BroadcastReceiver
因{{1}而无法启动国旗。
要接收广播,您的申请流程应处于活动状态。如果应用程序的进程不活动,Android OS不允许FLAG_EXCLUDE_STOPPED_PACKAGES
接收某些广播。
如果您正在运行某个活动,则您的进程处于活动状态,因此您的接收方可以接收广播。
您可以做的是在没有任何UI的情况下进行透明活动
BroadcastReceiver
并使用<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
在后台启动服务,然后拨打startService()
的{{1}}。当您的服务正在运行时,您的进程仍处于活动状态,因此Android操作系统会让您进入接收广播。
答案 1 :(得分:0)
Could it possibly because I have no MainActivity?
,
不,不是因为mainActivity,你可以在没有mainActivity的情况下启动服务,所以问题可能是别的,请参考下面的例子,
public class MyStartServiceReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("", "in start service");
Intent service = new Intent(context, rs.class);
context.startService(service);
}
}
答案 2 :(得分:0)
试试这个:
从Activity
和setcontentview()
创建一个没有startService()
和Activity
的虚拟finish()
。
在manifest
移除启动器代码和go to > Run As > Run Configuration > check Launch radiobutton
,然后选择没有任何视图的Activity
(没有setcontentview()
)。