Android BroadcastReceiver, служба автозапуска после перезагрузки устройства

Привет, я пишу приложение, когда телефон перезагружается, служба автоматически запускается вместо того, чтобы нажимать на приложение.

Вот мой код для

BootCompleteReceiver.java

package com.example.newbootservice;

import android.content.BroadcastReceiver;  
import android.content.Context;  
import android.content.Intent;    

public class BootCompleteReceiver extends BroadcastReceiver {   

    @Override  
    public void onReceive(Context context, Intent intent) {  

        Intent service = new Intent(context, MsgPushService.class);  
        context.startService(service);   

    }  

}

MsgPushService.java

package com.example.newbootservice;

import android.app.Service;  
import android.content.Intent;  
import android.os.IBinder;   
import android.widget.Toast;

public class MsgPushService extends Service {  


    @Override  
    public void onCreate() {  
        super.onCreate();    
    }  

    @Override  
    public int onStartCommand(Intent intent, int flags, int startId) {  

        Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
        return Service.START_STICKY;  
    }  

    @Override
    public void onDestroy() {

        super.onDestroy();
        Toast.makeText(this, "Service Destroy", Toast.LENGTH_LONG).show();
    }

    @Override  
    public IBinder onBind(Intent arg0) {  
        return null;  
    }  
} 

MainActivity.java (не уверен, что мне это нужно)

package com.example.newbootservice;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        startService(new Intent(getBaseContext(), MsgPushService.class));
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

Манифест

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.newbootservice"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <service android:name=".MsgPushService"/>

        <receiver android:name=".BootCompleteReceiver">  
            <intent-filter>     
                <action android:name="android.intent.action.BOOT_COMPLETED"/>  
                <category android:name="android.intent.category.DEFAULT" />  
            </intent-filter>  
        </receiver>

        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Я хочу, чтобы служба запускалась автоматически после перезагрузки, а не запускалась вручную.


person BangBoat    schedule 17.01.2013    source источник
comment
у проверить мое решение!   -  person Dixit Patel    schedule 17.01.2013


Ответы (5)


Сначала сделайте это

1) В вашем элементе <manifest>:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
person Dixit Patel    schedule 17.01.2013
comment
Диксит, это работает! Спасибо. Есть ли у вас какие-либо идеи, хочу ли я, чтобы пользователь не убил службу, и она снова запустит службу, используя сигнал тревоги или какой-то триггер для ее активации? - person BangBoat; 17.01.2013
comment
Служба @BangBoat автоматически закрывается, когда ее работа завершена, и служба должна остановить себя, когда ее работа будет выполнена, вызвав stopSelf(), или другой компонент может остановить ее, вызвав stopService(). - person Dixit Patel; 17.01.2013
comment
Что я хочу сделать с моим приложением. Когда телефон украдут, сим-карта будет заменена, и служба сравнит серийный номер сим-карты, если отличается, служба/приложение сообщит владельцу электронное письмо. Я просто так потерялся, что делать дальше, прямо сейчас мой сервис будет запускаться после каждой перезагрузки устройства. - person BangBoat; 17.01.2013
comment
я не могу понять, что вы делаете в своем приложении - person Dixit Patel; 17.01.2013
comment
Фактически. Мое приложение для предотвращения кражи телефона. Приложение будет запущено все время, при каждой перезагрузке оно будет проверять sim по умолчанию по серийному номеру sim. Если серийный номер SIM-карты изменен (украден), то мое приложение отправит электронное письмо владельцу устройства. - person BangBoat; 17.01.2013
comment
эта служба будет запускаться после каждой перезагрузки устройства и проверять, изменена ли сим-карта или нет, для этого просто введите код сравнения сим-карт и отправьте код электронной почты в вашу службу. - person Dixit Patel; 17.01.2013
comment
У меня не работает на Nougat, я пытаюсь разбудить FirebaseMessagingService, который закрывается при принудительной остановке. - person Tas; 05.04.2017
comment
ссылка не работает. - person Nouman Ch; 06.06.2018
comment
Ссылка не битая, ее точно взломали xD - person Some random IT boy; 14.04.2020

Вы забыли о разрешениях

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
person agamov    schedule 17.01.2013

Хотя все приведенные выше ответы были правильными, однако с Android Oreo они наложили некоторые ограничения на фоновые службы.

Проверьте Ограничения фонового выполнения, чтобы узнать больше об ограничениях фонового режима в Android O.

Вы не можете запустить службу непосредственно из BroadCastReceiver, когда приложение находится в фоновом режиме.

Однако вы можете запустить службу переднего плана из получателя, вызвав startForegroundService() или используя JobIntentService, поскольку для JobIntentService такого ограничения нет.

person Kunu    schedule 08.03.2018
comment
я не могу реализовать с помощью службы переднего плана, не могли бы вы объяснить на примере - person Ravi Kilnake; 14.08.2018
comment
Это означает, что, как и в случае с Oreo, мы не можем запустить службу широковещательного приемника, когда приложение перезапускается, когда оно находится в фоновом режиме, верно? есть ли работа вокруг? - person Prajwal Waingankar; 22.03.2020

Используйте этот код в своем классе широковещательного приемника:

if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
   Intent service = new Intent(context, MsgPushService.class);  
    context.startService(service);  
  }
person Juboraj Sarker    schedule 24.12.2018

также попробуйте эти разрешения, это может помочь вам. Если вы используете телефоны htc, тогда эти разрешения необходимы.

<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
person saksham agarwal    schedule 24.03.2015