简体   繁体   中英

Android service not working after reboot, giving ANR error

Went through the documentation on how to start a service automatically after the device boots and tried all they said but couldn't get my service to work after rebooting the device, though it works perfectly well on first instance.
Below is my main activity (MainActivity.java) which starts the service after a button has been clicked, and triggers the service every 10 seconds using AlarmManager.

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);
}

Below is my receiver class (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);
    }
}

}

My service contains a thread which checks for multiple scenarios and builds a notification for each scenario. Here's a sample below:

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;

    }

And finally below is my AndroidManifest.xml code

<?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>

Please can someone tell me what I've done wrong?

Thanks to help from @MikeM I could fix the problem.

Instead of

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

I had to pass in the context as the first argument, in the receiver, as shown below

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM