重启后Android服务无法正常工作,给出ANR错误

时间:2016-02-04 00:15:38

标签: java android

通过关于如何start a service automatically after the device boots的文档并尝试了他们所说的但是在重新启动设备后无法使我的服务工作,尽管它在第一个实例上运行良好。
下面是我的主要活动(MainActivity.java),它在单击按钮后启动服务,并使用AlarmManager每10秒触发一次服务。

public void onClickSubmitDate(View view) {
    Intent service = new Intent(this, MyService.class);
    PendingIntent pendingIntent = PendingIntent.getService(this, 0, service, 0);

    AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 0, 10 * 1000, pendingIntent);

    //Enable receiver when device boots
    ComponentName receiver = new ComponentName(this, BootReceiver.class);
    PackageManager pm = this.getPackageManager();

    pm.setComponentEnabledSetting(receiver,
    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
    PackageManager.DONT_KILL_APP);
}

下面是我的接收器类(BootReceiver.java)

public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
Intent service = new Intent(context, MyService.class);
PendingIntent pendingIntent = PendingIntent.getService(null, 0, service, 0);

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
         alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                10 * 1000, 10 * 1000,
                pendingIntent);
    }
}

}

我的服务包含一个线程,该线程检查多个场景并为每个场景构建通知。以下是一个示例:

public int onStartCommand(Intent intent, int flags, int startId) {
        notification = new NotificationCompat.Builder(this);
        notification.setAutoCancel(true);

        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    boolean diff = true;
                    if (diff) {
                        // Build the notification
                        notification.setSmallIcon(R.drawable.icon);
                        notification.setTicker(getString(R.string.notification_ticker));
                        notification.setWhen(System.currentTimeMillis());
                        notification.setContentTitle(getString(R.string.notification_title));
                        notification.setContentText(getString(R.string.notification_1_text));
                        notification.setSound(alarmSound);

                        Intent i = new Intent(context, MainActivity.class);
                        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
                        notification.setContentIntent(pendingIntent);

                        // Builds a notification and issues it
                        NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                        Random r = new Random();
                        int rand = r.nextInt(1000);
                        nm.notify(rand, notification.build());
                    }
catch (Exception e) {
                    e.printStackTrace(); 
                }
            }
        };

        Thread stephThread = new Thread(r);
        stephThread.start();

        return START_STICKY;

    }

最后是我的AndroidManifest.xml代码

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.motherslove.stephnoutsa.myapplication18calendartest"
    android:installLocation="internalOnly">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MyDate"
            android:label="@string/title_activity_my_date"
            android:theme="@style/AppTheme.NoActionBar" />

        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true" />

        <receiver
            android:name=".BootReceiver"
            android:enabled="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

有人可以告诉我我做错了吗?

1 个答案:

答案 0 :(得分:0)

感谢@MikeM的帮助,我可以解决问题。

而不是

PendingIntent pendingIntent = PendingIntent.getService(null, 0, service, 0);

我必须在接收器中传递上下文作为第一个参数,如下所示

PendingIntent pendingIntent = PendingIntent.getService(context, 0, service, 0);