为什么广播接收器不能为服务应用android工作?

时间:2017-04-12 22:31:14

标签: android broadcastreceiver

我有一个只是服务的项目,它没有活动和用户界面。我想在手机完全启动时启动应用程序后台服务。但我从来没有收到" BOOT_COMPLETED"来自OS的消息。这些是我的代码:

清单:

plt.figure(figsize=(15,9))
# ... your code
plt.savefig(__file__ + ".png", dpi=360)

广播接收器:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.droid.arghaman.location_tracker">

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <receiver android:name=".BootBroadcastReceiver"
    android:enabled="true"
    android:exported="false"
    android:label="StartServiceAtBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
        <category android:name="android.intent.category.DEFAULT"></category>
    </intent-filter>

    </receiver>
</application>

<service android:name=".mySevice"></service>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
</manifest>

为myService:

public class BootBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("boot Received", intent.getAction());
        Intent serviceLuncher = new Intent(context, myService.class);
        context.startService(serviceLuncher);
    }
}

但是我从来没有得过#34; boot Received&#34;登录。 有任何错误,有没有办法调试我的程序?

我建议我的项目必须只有这个服务,它不能有任何UI。

2 个答案:

答案 0 :(得分:2)

  

我从未收到&#34; BOOT_COMPLETED&#34;来自OS的消息

部分原因是您没有<receiver>设置接收android.intent.action.BOOT_COMPLETED广播。

部分原因是,在设备上的某些内容使用明确的Intent启动您的某个组件之前,您的应用才会收到广播。您的应用程序的设置方式 - 没有用户可以运行的活动 - 任何应用程序都不太可能这样做,因此您的代码永远不会运行。

此外,请注意Android O的更改专门用于防止后台服务长时间运行并限制您获取后台位置更新的能力(您的location_tracker名称表明您要添加在将来)。您可能希望重新考虑是否以自己的方式编写此应用程序是一个明智的过程。

答案 1 :(得分:0)

在你的清单中试试这个

 <receiver android:name=".BootBroadcastReceiver"
    android:enabled="true"
    android:exported="false"
    android:label="StartServiceAtBootReceiver">
      <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED" />
       </intent-filter>
    </receiver>