Android应用,仅限服务

时间:2014-03-26 05:37:30

标签: android service

我正在设计一个基本上只是服务的应用程序。

它没有MainActivity ......只是一个BroadcastReceiver和一个服务。每次构建和安装时,都没有任何反应。广播接收器检测电话是否连接到WiFi网络。如果未连接WiFi,则会停止Service(),否则为startService()。

该服务将检查Pebble app消息并在消息接收时执行某些命令。问题是如果没有MainActivity,我就无法启动该服务。

可能因为我没有MainActivity吗?

3 个答案:

答案 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)

试试这个:

Activitysetcontentview()创建一个没有startService()Activity的虚拟finish()

manifest移除启动器代码和go to > Run As > Run Configuration > check Launch radiobutton,然后选择没有任何视图的Activity(没有setcontentview())。