2016-08-10 3 views
0

Я пытаюсь запустить фоновый сервис, когда устройство загружается, но ничего не происходит. Это мой код:Запуск фоновой службы при загрузке ОС

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="it.test" 
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED"> 

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <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"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

Autostart.java

package it.test; 

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

public class Autostart extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
     Intent intent = new Intent(arg0, AppService.class); 
     arg0.startService(intent); 
     Log.e("it.Test", "***** SERVER STARTING CALLED *****"); 

    } 
} 

AppService.java

package it.test; 

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

public class AppService extends Service { 

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

    @Override 
    public void onDestroy() { 
     Toast.makeText(this, "My AppService Stopped", Toast.LENGTH_LONG).show(); 
     Log.e("it.Test", "***** SERVICE STOPPED *****"); 
    } 

    @Override 
    public void onStart(Intent intent, int startid) { 
     Toast.makeText(this, "My AppService Started", Toast.LENGTH_LONG).show(); 
     Log.e("it.Test", "***** SERVICE STARTED *****"); 
     /* 
     MainActivity.calc(); 
     MainActivity.save(); 
     */ 
    } 
} 

Когда мой телефон загружается, я не вижу тостов (я не вижу ни одного «My AppService Started» или «My AppService Stopped»), и ничего не регистрируется приложением ... Кто-нибудь знает, что я делать неправильно ?? Спасибо!

EDIT: Решение проблемы Осмотрев пост Trying to start a service on boot on Android связанный в ответ, и после многих отладки я нашел решение моей проблемы :) Спасибо всем!

Модификация AndroidManifest.xml

Добавлено в <application>:

<receiver android:name="it.test.Autostart"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
</receiver> 

<service 
    android:name="it.test.AppService" 
    android:enabled="true" /> 

Добавлено также:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    [...] 
    android:installLocation="internalOnly"> 

Модификации AppService.java Чтобы сделать работу службы, Мне пришлось переопределить класс AppService onStartCommand вместо onStart, поэтому я полностью удалил метод onStart из моего класса. Новый onStartCommand:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Toast.makeText(this, "My AppService Started", Toast.LENGTH_LONG).show(); 
    Log.e("it.Test", "***** SERVICE STARTED ***** from onStartCommand"); 
    MainActivity.calc(this); 
    MainActivity.save(); 
    return Service.START_REDELIVER_INTENT;//todo I'm not sure about what I have to return 
} 

ответ

0

Вы должны зарегистрировать вещательный приемник:

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

Вам нужно это в вашем файле манифеста:

<receiver android:name=".it.test.Autostart"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    </intent-filter> 
</receiver> 
2

Ваш радиовещательный приемник не зарегистрирован в AndroidManifest. xml

Вам необходимо зарегистрировать литой приемник:

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

Если ваше приложение установлено на внешнее хранилище, оно не получит широковещательное сообщение BOOT_COMPLETE. Чтобы предотвратить это, вы можете установить приложение во внутреннюю память. вы можете сделать это, просто добавив эту строку в AndroidManifest.XML

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

Источник: https://stackoverflow.com/a/32938071/1549700

+0

Тег '' должны быть добавлены или Sevice не будет называться. Вы также должны переопределить 'Service # onStartCommand', а не' Service # onStart' (ведьма устарела) – Someone

0

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

1

Вы зарегистрировать свой широковещательный приемник и службу по <application> теге

<!-- [START service_listener] --> 
    <service 
     android:name=".it.test.AppService" 
     android:enabled="true" /> 
    <!-- [END service_listener] --> 

    <!-- [START broadcast_receiver] --> 
    <receiver android:name=".it.test.Autostart"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     </intent-filter> 
    </receiver> 
    <!-- [END broadcast_receiver] --> 
+0

Добавление тега '' и теги '' помогли, но этого недостаточно: 'Service # onStartCommand', а не 'Service # onStart' (ведьма устарела) должна быть переопределена – Someone