2012-08-12 4 views
1

Я просмотрел несколько сообщений на этом сайте о BOOT_COMPLETED, не вызывая Broadcast Receiver. Я думал, что моя проблема была похожа на этот вопрос. BroadcastReceiver not working after BOOT_COMPLETEDBOOT_COMPLETED не звонил BroadcastRecevier

Однако я не пытаюсь захватить более одного Intent в одном сервисе. Мне просто нужно действие BOOT_COMPLETED.

Можете ли вы просмотреть мой код и сообщить мне, где и как его исправить?

Вот Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.google.android.gcm.demo.app" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <!-- GCM requires Android SDK version 2.2 (API level 8) or above. --> 
    <!-- 
     The targetSdkVersion is optional, but it's always a good practice 
     to target higher versions. 
    --> 
    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="16" /> 

    <!-- GCM connects to Google Services. --> 
    <uses-permission android:name="android.permission.INTERNET" /> 

    <!-- GCM requires a Google account. --> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 

    <!-- Keeps the processor from sleeping when a message is received. --> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 

    <!-- 
    Creates a custom permission so only this app can receive its messages. 

    NOTE: the permission *must* be called PACKAGE.permission.C2D_MESSAGE, 
      where PACKAGE is the application's package name. 



    --> 
    <permission 
     android:name="com.google.android.gcm.demo.app.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 

    <uses-permission android:name="com.google.android.gcm.demo.app.permission.C2D_MESSAGE" /> 

    <!-- This app has permission to register and receive data message. --> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

    <!-- permission for network state --> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

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

    <!-- Main activity. --> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name="com.google.android.gcm.demo.app.DemoActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name="com.google.android.gcm.demo.app.sqllite.SQLViews" > 
     </activity> 
     <activity android:name="com.google.android.gcm.demo.app.ScheduleView" > 
     </activity> 
     <activity android:name="com.google.android.gcm.demo.app.ConventionView" > 
     </activity> 
     <activity android:name="com.google.android.gcm.demo.app.EventList.DataView" > 
     </activity> 
     <activity android:name="com.google.android.gcm.demo.app.EventList.EventDetails" > 
     </activity> 
     <activity android:name="com.google.android.gcm.demo.app.Alerts.AlertView" > 
     </activity> 
     <activity android:name="com.google.android.gcm.demo.app.Alerts.AlertDetails" > 
     </activity> 

     <service 
      android:name="com.google.android.gcm.demo.app.Alerts.AlarmsService" 
      class="com.google.android.gcm.demo.app.Alerts.AlarmsService" > 
      <intent-filter> 
       <action 
        android:name="com.google.android.gcm.demo.app.Alerts.AlarmsService" 
        android:value="com.google.android.gcm.demo.app.Alerts.AlarmsService" /> 
      </intent-filter> 
     </service> 

     <receiver 
      android:name="com.google.android.gcm.demo.app.Alerts.AlarmsBroadcastReceiver" 
      android:enabled="true" 
      android:exported="true" > 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 

     <!-- 
      BroadcastReceiver that will receive intents from GCM 
      services and handle them to the custom IntentService. 

      The com.google.android.c2dm.permission.SEND permission is necessary 
      so only GCM services can send data messages for the app. 




     --> 
     <receiver 
      android:name="com.google.android.gcm.GCMBroadcastReceiver" 
      android:permission="com.google.android.c2dm.permission.SEND" > 
      <intent-filter> 

       <!-- Receives the actual messages. --> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <!-- Receives the registration id. --> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 

       <category android:name="com.google.android.gcm.demo.app" /> 
      </intent-filter> 
     </receiver> 

     <!-- 
      Application-specific subclass of GCMBaseIntentService that will 
      handle received messages. 

      By default, it must be named .GCMIntentService, unless the 
      application uses a custom BroadcastReceiver that redefines its name. 



     --> 

     <service android:name=".GCMIntentService" /> 
    </application> 

</manifest> 

Broadcast Receiver:

package com.google.android.gcm.demo.app.Alerts; 

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

public class AlarmsBroadcastReceiver extends BroadcastReceiver { 

    private static final String TAG = "BootReceiver"; 

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

     if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { 

      startServiceIntent = new Intent(context, AlarmsService.class); 
      context.startService(startServiceIntent); 
      Log.d("TAG", "alarmBroadcastReceiver"); 

      System.out.println("alarm broadcast reciver..."); 

     } 



    } 

} 

Услуги:

package com.google.android.gcm.demo.app.Alerts; 

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


public class AlarmsService extends Service { 


     String tag="alerttService"; 
     @Override 
     public void onCreate() { 
      super.onCreate(); 
      Toast.makeText(this, "Service created...", Toast.LENGTH_LONG).show();  
      Log.i(tag, "Service created..."); 
     } 

     public int onStartCommand(Intent intent, int flags, int startId) { 
      Log.d("TAG", "Service command started."); 
      return super.onStartCommand(intent, flags, startId); 
     } 


     @Override 
     public void onStart(Intent intent, int startId) {  
      super.onStart(intent, startId); 

      Toast.makeText(this, "Service started...", Toast.LENGTH_LONG).show(); 
      Log.i(tag, "Service started. .."); 
     } 

     @Override 
     public void onDestroy() { 
      super.onDestroy(); 
      Toast.makeText(this, "Service destroyed...", Toast.LENGTH_LONG).show(); 
     } 

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

} 
+2

Установлен ли он на SD-карту или внутри? Вы пытались настроить 'android: installLocation' на' internalOnly' на свой '' элемент? – Jens

+1

Где вы тестируете этот код (устройство/эмулятор? Какая версия ОС?)? Вы запускали свою деятельность вручную (например, через пусковую установку), прежде чем пытаться перезагрузить компьютер? – CommonsWare

+0

Я тестирую это на эмуляторе. Min 8, Target 16. – Leoa

ответ

1

Я использую эмуляторы, которые я создал, прежде чем я установил для Jellybean SDK. Я создал новые эмуляторы для всех версий, и теперь программа работает в Android 8 и выше на эмуляторе.