0

BroadcastReceiver を呼び出すには、次のコードが必要です。

 public class WorkItemAlarmManager {
    ...
        public void initAlarm(HelpMe helpMe, String delay,String period,WorkItem workItem){
            //HelpMe = Activity
helpMe.registerReceiver(new WorkItemAlarmHandler() , new IntentFilter("WORK_ITEM_ALARM"));

            Intent intent = new Intent("WORK_ITEM_ALARM");
            intent.setClass(helpMe, WorkItemAlarmManager.class);
            intent.putExtra("work_item", workItem);
            PendingIntent mAlarmSender = PendingIntent.getService(helpMe, 0,intent, 0);

            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            //System.out.println("START"+System.currentTimeMillis());   
            calendar.add(Calendar.SECOND, calcDelayMillis(delay));
            //System.out.println("END"+calendar.getTimeInMillis());
            AlarmManager am = (AlarmManager) helpMe.getSystemService(Context.ALARM_SERVICE);
            am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), mAlarmSender);
        }
    ...
    }

および BroadcastReceiver:

public class WorkItemAlarmHandler extends BroadcastReceiver{

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

}

しかし、WorkItemAlarmHandler が呼び出されることはありません。

更新: 最初にマニフェストに BroadcastReceiver を登録しようとしました。しかし、それはうまくいきませんでした:

<receiver
            android:name="de.helpme.alarm.WorkItemAlarmHandler"
            android:enabled="true"
            android:label="WorkItemAlarmHandler" >
            <intent-filter>
                <action android:name="WORK_ITEM_ALARM" />
            </intent-filter>
        </receiver>

あなたの答えをありがとう:)。今では動作しますが、両方の回答を一度に実装したため、どちらが正しいかはまだわかりません。どちらが正しいかがわかったら、正しいものを答えとしてマークします。

更新: 問題の原因は次のとおりです。

PendingIntent mAlarmSender = PendingIntent.getService(helpMe, 0,intent, 0);

このコードを使用すると、正常に動作します。

PendingIntent mAlarmSender = PendingIntent.getBroadcast(helpMe, 0, intent, 0);

あなたのご親切に感謝します!

4

2 に答える 2

1

これを試して :

WorkItemAlarmManager で;

public class WorkItemAlarmManager {
    ...
        public void initAlarm(HelpMe helpMe, String delay,String period,WorkItem workItem){
            Intent intent =new Intent(helpMe, WorkItemAlarmHandler.class);
            intent.setAction("WORK_ITEM_ALARM");
            intent.putExtra("work_item", workItem);
            PendingIntent mAlarmSender=
            PendingIntent.getBroadcast(helpMe, 0, intent, 0);
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(System.currentTimeMillis());
            //System.out.println("START"+System.currentTimeMillis());   
            calendar.add(Calendar.SECOND, calcDelayMillis(delay));
            //System.out.println("END"+calendar.getTimeInMillis());
            AlarmManager am = (AlarmManager) helpMe.getSystemService(Context.ALARM_SERVICE);
            am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), mAlarmSender);
        }
    ...
    }

および WorkItemAlarmHandler で:

public class WorkItemAlarmHandler extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals("WORK_ITEM_ALARM")){
            Toast.makeText(context, "WORK_ITEM_ALARM", Toast.LENGTH_LONG).show();
            }else{
            Toast.makeText(context, "repeating alarm",
            Toast.LENGTH_LONG).show();
            }
    }

}
于 2012-06-06T15:39:09.773 に答える
1

あなたのコードは以下を使用します:

intent.setClass(helpMe, WorkItemAlarmManager.class);

ただし、setClass(...) メソッドを使用して、最終的にインテントを処理するクラスを指定します。

したがって、次のように書く必要があります。

intent.setClass(helpMe, WorkItemAlarmHandler.class);

私が覚えている限り、クラスまたはコンポーネントを手動で (たとえば setClass() メソッドを使用して) 指定する場合、このオブジェクトをマニフェストで指定する必要があるため、レシーバーがそこに記載されていることを確認してください。

于 2012-06-06T15:46:39.023 に答える