5

特定の時間に通知を作成しようとしています。ブロードキャスト レシーバーを作成し、AlarmManager を介して呼び出します。問題は、ブロードキャストが受信されず、通知が届かないことです。

放送受信機をマニフェストに登録し、

<receiver
        android:name="com.example.android.receivers">
        <intent-filter>
            <action android:name="com.example.android.receivers.AlarmReceiver" />
        </intent-filter>
    </receiver>

これはブロードキャスト レシーバーです。

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context pContext, Intent pIntent) {

//      if (pIntent.getAction().equalsIgnoreCase("")) {
//          
//      }
        Log.d("Alarm Receiver", "onReceive called");        
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(pContext).setSmallIcon(R.drawable.icon).setContentTitle("Test Notification")
                        .setContentText("Test Notification made by Syed Ahmed Hussain");
        Intent resultIntent = new Intent(pContext, CalendarView.class);

        // The stack builder object will contain an artificial back stack for the
        // started Activity.
        // This ensures that navigating backward from the Activity leads out of
        // your application to the Home screen.
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(pContext);
        // Adds the back stack for the Intent (but not the Intent itself)
        stackBuilder.addParentStack(CalendarView.class);
        // Adds the Intent that starts the Activity to the top of the stack
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
        notificationBuilder.setContentIntent(resultPendingIntent);
        NotificationManager mNotificationManager = (NotificationManager) pContext.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(1, notificationBuilder.build());
    }

}

アラームを作成するメイン アクティビティからのコード。

/**
     * 
     * @param pDate
     * @param pTime
     */
    private void createNotification(String pDate, String pTime) {
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, AlarmReceiver.class);
        PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
//      alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60 * 1000, alarmIntent);
        alarmManager.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis(), alarmIntent);
    }

誰かが私が間違っていることを指摘して修正できますか? ありがとうございました。

4

1 に答える 1

8

マニフェストのレシーバーの定義が間違っています。

これを試して:

<receiver android:name="com.example.android.receivers.AlarmReceiver" />

では、受信者の絶対パッケージ+クラス、またはマニフェストのルート要素で指定したandroid:nameからの相対を指定する必要があります。package="com.example.android"例えば:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android" >

レシーバーのアクション セクションでは、リッスンするアクションを指定します。したがって、次の方法でも実行できます。

クラスではなくアクションに基づいてインテントを作成する

public static final String ACTION = "com.example.android.receivers.NOTIFICATION_ALARM";

private void createNotification(String pDate, String pTime) {
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(ACTION);
    PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
    alarmManager.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis(), alarmIntent);
}

次に、レシーバーで複数のアクションを処理できます。

@Override
public void onReceive(Context pContext, Intent pIntent){
        if (pIntent.getAction().equals(ACTION)){
            // Here your handle code
        }
}

ただし、次のようにマニフェストでレシーバーを宣言する必要があります。

<receiver android:name="com.example.android.receivers">
    <intent-filter>
        <action android:name="com.example.android.receivers.NOTIFICATION_ALARM" />
    </intent-filter>
</receiver>

両方の方法を使用できます。

于 2013-11-13T23:43:01.333 に答える