服务未在 BOOT COMPLETE 上启动
service not started on BOOT COMPLETE
我有一个服务,我想在 BOOT COMPLETE 时启动
当它启动时,我显示了一条 toast 消息。
我的问题是,当设备启动时,toast 显示并卡在屏幕上,服务未正确启动。
但是,如果我尝试通过 activity 启动我的服务,则服务启动良好,并且 toast 正确地在几秒后消失。
我的清单:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tfl.extprotocolservice"
android:versionCode="7"
android:versionName="1.6" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<application
android:allowBackup="true"
android:icon="@drawable/launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name="com.tfl.extprotocolservice.ExtProtocolBroadcastReceiver"
android:enabled="true" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service android:name=".ExtProtocolService" >
<intent-filter>
<action android:name="com.tfl.extprotocolservice.ISetIpPort" />
</intent-filter>
<intent-filter>
<action android:name="com.tfl.extprotocolservice.IExtMessage" />
</intent-filter>
</service>
<!--
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
-->
</application>
</manifest>
我的广播接收器:
public class ExtProtocolBroadcastReceiver extends BroadcastReceiver {
/* broadcast receiver to start on BOOT COMPLETE*/
@Override
public void onReceive(Context context, Intent intent) {
Intent StartServiceIntent=new Intent(context,ExtProtocolService.class);
context.startService(StartServiceIntent);
}
}
顺便说一句,清单中的 activity 被注释了,因为我真的不需要它,它只是为了测试从 activity.
启动服务
我试过 am broadcast -a android.intent.action.BOOT_COMPLETED
然后它重启了设备。
你可以试试<action android:name="android.intent.action.USER_PRESENT"/>
经过进一步研究,我认为是fastboot mode
不会播放BOOT_COMPLETE。
您的服务正在过滤操作,但您的意图并未提供任何操作。
用这个修复:
StartServiceIntent.setAction("com.tfl.extprotocolservice.IExtMessage");
如果您的应用程序没有活动,您的 BroadcastReceiver
将永远不会被调用。
当您安装应用程序时,它会安装在 "stopped state" 中。 "stopped state" 中的应用程序没有收到传送给他们的广播 Intent
。
为了让您的应用程序退出 "stopped state",用户必须手动启动您的应用程序(至少一次)。为此,您必须向他提供一个 Activity
,他可以用它来启动您的应用程序。
一旦您的应用程序不再处于 "stopped state" 中,Android 将向其发送广播 Intent
。也就是说,直到用户 "force stops" 你的申请。
如果用户 "force stops" 您的应用程序,它将返回到 "stopped state" 并且将不再获得广播 Intent
。直到用户再次手动启动你的应用程序。
我有一个服务,我想在 BOOT COMPLETE 时启动
当它启动时,我显示了一条 toast 消息。
我的问题是,当设备启动时,toast 显示并卡在屏幕上,服务未正确启动。
但是,如果我尝试通过 activity 启动我的服务,则服务启动良好,并且 toast 正确地在几秒后消失。
我的清单:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tfl.extprotocolservice"
android:versionCode="7"
android:versionName="1.6" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<application
android:allowBackup="true"
android:icon="@drawable/launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name="com.tfl.extprotocolservice.ExtProtocolBroadcastReceiver"
android:enabled="true" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service android:name=".ExtProtocolService" >
<intent-filter>
<action android:name="com.tfl.extprotocolservice.ISetIpPort" />
</intent-filter>
<intent-filter>
<action android:name="com.tfl.extprotocolservice.IExtMessage" />
</intent-filter>
</service>
<!--
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
-->
</application>
</manifest>
我的广播接收器:
public class ExtProtocolBroadcastReceiver extends BroadcastReceiver {
/* broadcast receiver to start on BOOT COMPLETE*/
@Override
public void onReceive(Context context, Intent intent) {
Intent StartServiceIntent=new Intent(context,ExtProtocolService.class);
context.startService(StartServiceIntent);
}
}
顺便说一句,清单中的 activity 被注释了,因为我真的不需要它,它只是为了测试从 activity.
启动服务我试过 am broadcast -a android.intent.action.BOOT_COMPLETED
然后它重启了设备。
你可以试试<action android:name="android.intent.action.USER_PRESENT"/>
经过进一步研究,我认为是fastboot mode
不会播放BOOT_COMPLETE。
您的服务正在过滤操作,但您的意图并未提供任何操作。 用这个修复:
StartServiceIntent.setAction("com.tfl.extprotocolservice.IExtMessage");
如果您的应用程序没有活动,您的 BroadcastReceiver
将永远不会被调用。
当您安装应用程序时,它会安装在 "stopped state" 中。 "stopped state" 中的应用程序没有收到传送给他们的广播 Intent
。
为了让您的应用程序退出 "stopped state",用户必须手动启动您的应用程序(至少一次)。为此,您必须向他提供一个 Activity
,他可以用它来启动您的应用程序。
一旦您的应用程序不再处于 "stopped state" 中,Android 将向其发送广播 Intent
。也就是说,直到用户 "force stops" 你的申请。
如果用户 "force stops" 您的应用程序,它将返回到 "stopped state" 并且将不再获得广播 Intent
。直到用户再次手动启动你的应用程序。