1

BOOT_COMPLETED を呼び出さないことについて、このサイトのいくつかの投稿を見てきましたBroadcast Receiver。私の問題はこの質問に似ていると思いました BOOT_COMPLETED後にBroadcastReceiverが機能しない

Intentただし、 1 つのサービスで複数をキャプチャしようとしているわけではありません。BOOT_COMPLETEDアクションが欲しいだけです。

私のコードを調べて、どこをどのように修正すればよいか教えていただけますか?

マニフェストは次のとおりです。

    <?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>

放送受信機:

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;
       }

}
4

1 に答える 1

1

Jellybean の sdk をインストールする前に作成したエミュレーターを使用していました。すべてのバージョンの新しいエミュレーターを作成し、エミュレーターで Android 8 以降で動作するプログラムになりました。

于 2012-08-12T21:27:14.003 に答える