2013-05-04 2 views
1

Кто-то (участник «buptcoder») помог мне решить проблему, которую я имел, очень быстро и красиво. Я рад, что нашел здесь сообщество. Всем спасибо.Android - Невозможно понять, как служба может быть запущена даже после перезагрузки.

Я прочитал много веб-страниц, говорящих «начиная службу во время загрузки», но у меня все еще есть вопрос в голове.

Вот код, который у меня уже есть: Я нажимаю кнопку (в действии), которая запускает службу, которая регистрирует BroadcastReceiver (SMS_RECEIVED). Когда я нажимаю кнопку «Назад» (кнопка Google Android), служба (и BroadcastReceiver) по-прежнему активна. Хорошо.

Вот что я хочу: Я хочу, чтобы эта услуга (которая была активирована кнопкой), чтобы автоматически перезапустить, даже если пользователь перезагрузит телефон. Активация службы динамическая, и я не хочу, чтобы она запускалась, если пользователь не нажал кнопку.

Я знаю, что должен использовать действие BOOT_COMPLETED, но я не могу понять, как мы можем это сделать точно.

Если кто-то может понять то, что я написал, и помочь мне :)

Спасибо.

ответ

1

Вы упомянули: I know I should use action BOOT_COMPLETED but I can't understand how we can do it exactly.

Вы хотите знать, как можно использовать BOOT_COMPLETED действие? Чтобы использовать это, вам необходимо внести некоторые изменения в свой файл Manifest. Если вы указали свой приемник в манифесте, вы можете добавить действие в тег <intent-filter>. Что-то выглядит следующим образом:

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

Внутри OnReceive функции вашего вещательного приемника, вы можете сделать любые действия, которые вы хотите сделать, когда BOOT_COMPLETE принимается. Что-то вроде:

//Inside your BroadCast Receiver: 
@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction()!= null){ 
     if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED")){ 
      // Do something here 
     } 
    } 
} 

Вам также может потребоваться добавить это разрешение

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

Надеется, что это помогает еще, пожалуйста, комментарию.

0

Добро пожаловать :). Шобхит Пури хорошо задал ваш вопрос. Я хочу добавить некоторые для вашего вопроса. Если вы просто хотите отслеживать SMS, вам даже не нужно писать услугу. Просто напишите приемник, и указать его в AndroidManifest.xml, приемник будет работать хорошо, даже если пользователь перезагрузить устройство:

<receiver android:name=".YourSmsReceiver" > 
<intent-filter> 
    <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
    .... 
</intent-filter> 
</receiver> 

    //Inside your YourSmsReceiver 
@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction()!= null){ 
     if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){ 
      // Handle SMS here 
     } 
    } 
} 
+0

Просто добавив к нему, я думаю, что если вы хотите, чтобы приемник работать даже после перезагрузки, вам необходимо включить BOOT_COMPLETED. На этом есть много потоков. Проверьте [this] (http://stackoverflow.com/questions/6878816/broadcastreceiver-not-working-after-boot-completed) и [это] (http://stackoverflow.com/questions/5082735/broadcast-receiver- не-рабочие после перезагрузки). –

+0

Спасибо вам обоим. Ваши ответы решают часть моей проблемы. Действительно, я упомянул, что хочу, чтобы Android узнал, нажал ли пользователь кнопку (активировать услугу). Если нет, я не хочу, чтобы Android запускал мой сервис во время загрузки. Это динамическая регистрация. Я думаю, что если я жестко код в файле манифеста, он не будет динамическим. Может быть, я должен добавить действие (BOOT_COMPLETED) динамически через addAction, как я сделал с SMS_RECEIVED. (Для buptcoder: у меня будет несколько сервисов. Как я писал в своем предыдущем сообщении, кнопка запускает службы, которые регистрируют широковещательный приемник). Благодарю. – frontal

Смежные вопросы