如何设置服务的优先级以确保它在启动时启动?

时间:2015-07-10 18:29:33

标签: android

我试图在启动时启动我的服务,但我一直收到1245-1263/? I/ActivityManager﹕ Waited long enough for: ServiceRecord{3d8aa3b0 u9 myPackage/.myService}例外。

我看过这个:My service always getting Waited long enough for: ServiceRecord error in Kitkat 它告诉我ActivityManager正在启动我的服务。我通过日志声明确认我的接收器确实在工作。以下是有兴趣的人的代码:

public class PhoneStateReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("OnStartUp", "Service is about to be started");
        Intent myIntent = new Intent(context, myService.class);
        context.startService(myIntent);
    }
}

那么,我怎样才能将我的服务优先级设置为"必要"那么Android确保它启动?我查看了这个:How to set the priority of android service?但是它涉及重新启动服务而不是初始启动。

这是我的清单的相关部分:

<receiver android:name=".PhoneStateReceiver"
    android:enabled="true"
    android:label="PhoneStateReceiver"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>
<service
    android:name=".myService"
    android:enabled="true"
    android:exported="true" >
</service>

提前致谢。

2 个答案:

答案 0 :(得分:2)

您必须注册一个启动完成的广播接收器,然后从那里开始您的服务。这是一个有效的实施。也许是你遗失的<uses-permission>部分?

修改

在我的清单(重要部分)中,我在开头有<uses-permission>部分。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>

    <!-- for services (must be rescheduled after boot) -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <receiver android:name=".services.BootCompletedReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

</manifest>

我的接收器类看起来像这样。注意,我正在启动一个IntentService。

public class BootCompletedReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent msgIntent = new Intent(context, ReminderService.class);
        msgIntent.setAction(ReminderService.ACTION_RESCHEDULE);
        context.startService(msgIntent);
    }
}

答案 1 :(得分:0)

从发布的代码中,看起来清单正在寻找名为.myService的服务,而在BroadcastREceiver中,您尝试启动名为LocationService.class的服务。

这可能是个问题。