Загрузка Android BroadCast не вызывается - PullRequest
1 голос
/ 24 февраля 2012

В настоящее время я пытаюсь создать широковещательный приемник, который будет запускаться после загрузки устройства Android, а затем будет запускать фоновую службу.Я пробовал много примеров, но не знаю, где я иду не так.Я следую этому примеру: https://github.com/commonsguy/cw-advandroid/tree/master/SystemEvents/OnBoot Я импортировал весь этот проект в свою рабочую область и попытался запустить.Но получатель не вызывал или так.Пожалуйста, помогите мне. Мое тестирующее устройство: Motorolla Xoom с ICS 4.0.3

РЕДАКТИРОВАТЬ

Manifest

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

<supports-screens
    android:anyDensity="true"
    android:largeScreens="true"
    android:normalScreens="true"
    android:smallScreens="true" />

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

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <service
        android:name="awais.soft.MyService"
        android:enabled="true" >
        <intent-filter>
            <action android:name="awais.soft.MyService" >
            </action>
        </intent-filter>
    </service>

    <receiver android:name="awais.soft.ServicesDemoActivity" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" >
            </action>

            <category android:name="android.intent.category.HOME" >
            </category>
        </intent-filter>
    </receiver>
</application>

Приемник вещания

package awais.soft;

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

public class ServicesDemoActivity extends BroadcastReceiver {

static final int idBut = Menu.FIRST + 1, idIntentID = Menu.FIRST + 2;

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

    Log.e("Awais", "onReceive:");
    if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
        Intent i = new Intent();
        i.setAction("awais.kpsoft.MyService");
        context.startService(i);

    }

}

}

Служба

package awais.soft;

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

public class MyService extends Service {
private static final String TAG = "MyService";
MediaPlayer player;

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

@Override
public void onCreate() {
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onCreate");

    player = MediaPlayer.create(this, R.raw.is);
    player.setLooping(false); // Set looping
}

@Override
public void onDestroy() {
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onDestroy");
    player.stop();
}

@Override
public void onStart(Intent intent, int startid) {
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onStart");
    player.start();
}

}

Ответы [ 5 ]

1 голос
/ 24 февраля 2012

см. Я публикую вам пример, который поможет вам

Для некоторых приложений вам нужно будет запустить и запустить службу при запуске устройства без вмешательства пользователя. Такие приложения в основном включают мониторы (телефония, Bluetooth, сообщения, другие события). По крайней мере, эта функция в настоящее время разрешена чрезмерно ограничительной политикой разрешений Android.

Шаг 1: Сначала вам нужно будет создать простой сервис, определенный в Monitor.java:

public class Monitor extends Service {

private static final    String              LOG_TAG = "::Monitor";

@Override
public void onCreate() {
    super.onCreate();
    Log.e(LOG_TAG, "Service created.");
}

@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
    Log.e(LOG_TAG, "Service started.");
}
@Override
public void onDestroy() {
       super.onDestroy();
       Log.e(LOG_TAG, "Service destroyed.");
}

@Override
public IBinder onBind(Intent intent) {
    Log.e(LOG_TAG, "Service bind.");
    return null;
}

}

Шаг 2: Далее нам нужно создать класс приемника Broadcast, StartAtBootServiceReceiver.java:

  public class StartAtBootServiceReceiver extends BroadcastReceiver
    {
  private static final  String  LOG_TAG=StartAtBootServiceReceiver";
  @Override
  public void onReceive(Context context, Intent intent)
  {
        Log.e(LOG_TAG, "onReceive:");
     if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
        Intent i = new Intent();
        i.setAction("test.package.Monitor");
        context.startService(i);
    }
}

}

Шаг 3: Наконец, ваш файл AndroidManifest.xml должен содержать следующее:

 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="test.package.Monitor"
    android:versionName="1.0"
    android:versionCode="100"
    android:installLocation="internalOnly">
    <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true" />

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

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

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <service android:name="test.package.Monitor">**
        <intent-filter>
            <action android:name="test.package.Monitor">
            </action>
        </intent-filter>
    </service>
    <receiver android:name="test.package.StartAtBootServiceReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED">
            </action>
            <category android:name="android.intent.category.HOME">
            </category>
        </intent-filter>
    </receiver>
</application>

Мне нужно выделить некоторые наиболее важные аспекты, ключевые факторы возможных ошибок при реализации:
1) Необходимо предоставить разрешение android.permission.RECEIVE_BOOT_COMPLETED (в декларации xml)
2) Установка должна выполняться во внутреннем хранилище, а не на SDCARD! Чтобы применить это, используйте android: installLocation = "internalOnly" в манифесте

1 голос
/ 24 февраля 2012

Все было хорошо ..: S Проблема была с устройством .. (т.е. Motorolla Zoom ICS 4.0.3)

Сейчас тестируется на Galaxy Tab с 2.2 и работает нормально ..

Спасибо всем за ваше время

1 голос
/ 24 февраля 2012

Я что-то вроде этого в Моем приложении и оно работает для меня.

public class DeviceBootReceiver extends BroadcastReceiver {

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

        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
        //  CustomLog.i("Boot Completed");
        }
    }
}

Манифест Android

<receiver android:name=".model.service.DeviceBootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
                <category android:name="android.intent.category.HOME"></category>
            </intent-filter>
</receiver>

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

Пожалуйста, проверьте, дали ли вы разрешение на RECEIVE_BOOT_COMPLETED

0 голосов
/ 19 февраля 2013

Проблема сохраняется в случае устройств с версией Android более 3,0, кстати, это не проблема, это было сделано в целях безопасности Google, я думаю .. Если вам нужно запустить службу при загрузке, вы должны составить собственное намерение и передать его. Для создания настраиваемого намерения вы должны создать служебный файл, из которого вам нужно будет передать это намерение при завершении загрузки, и ваш служебный файл (который вы хотите запустить) получит это намерение в своем методе onReceive, и ваш сервис будет запущен. Еще одна вещь файл сервиса, который вы создадите для вызова сервиса, который вы хотите запустить, должен храниться в папке system / app файлового менеджера устройства, если ваша файловая система показывает извините, файловая система только для чтения, то из командной строки просто сделайте adb remount и затем нажмите файл на устройстве, перезагрузите систему, ваша служба будет работать .. Cheers !!

0 голосов
/ 30 июня 2012

Если ваш телефон рутирован, то у вас возникнут проблемы при загрузке Android Boot-Up BroadCast, в противном случае вы должны убедиться, что ваше приложение имеет необходимые права root

...