12

私はこれに何時間も苦労してきました。ドキュメントといくつかのトピックも確認しました。私はこのコードを2つのトピックで見つけました。両方の人が、コードは完全に機能していると言いましたが、私のコンピューターでは機能していませんでした。最初のトーストが表示されますが、2番目のトーストは表示されません。なにが問題ですか?

public class HelloAndroid2 extends Activity {  


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);   

    Intent intent = new Intent(this, AlarmReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
    intent, PendingIntent.FLAG_ONE_SHOT);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent);
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();

}

 public final class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();

    }
 }

}

4

3 に答える 3

39

AlarmReceiver.classインテントでクラスを使用するため、実際にはアクションを指定する必要はありません。

で、タグ内に次のようなAndroidManifest.xmlレシーバー定義があることを確認してください。<application>

<receiver android:name="AlarmReceiver">

編集:わかりました、放送受信機を使用する2つの方法があります。

1)提供したコードから、次のAlarmReceiver.javaものが含まれます。

public final class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();

    }
 }

およびHelloAndroid2.java

public class HelloAndroid2 extends Activity {  


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);   

    Intent intent = new Intent(this, AlarmReceiver.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
    intent, PendingIntent.FLAG_ONE_SHOT);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent);
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();

}

}

AndroidManifest.xmlこのように、とタグで動作するように放送受信機を設定できます<receiver ...>

2)2番目の方法。このように、あなたはたった1つのファイルを使うことができますHelloWorld2.java

アクティビティでは、ブロードキャストレシーバーを作成して登録します。

public class HelloWorld2 extends Activity {
    private SharedPreferences prefs;
    private String mName;


    BroadcastReceiver alarmReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "Alarm worked", Toast.LENGTH_LONG).show();          
        }
    };


    public static final String ACTION_NAME = "com.helloworld.MYACTION";
    private IntentFilter myFilter = new IntentFilter(ACTION_NAME);


    @Override
    protected void onPause() {
        unregisterReceiver(alarmReceiver);
        super.onPause();
    }

    @Override
    protected void onResume() {
        registerReceiver(alarmReceiver, myFilter);
        super.onResume();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        registerReceiver(alarmReceiver, myFilter);

        Intent intent = new Intent(ACTION_NAME);        

        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
        intent, PendingIntent.FLAG_ONE_SHOT);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10 * 1000), pendingIntent);
        Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();


    }
于 2011-01-11T18:18:55.947 に答える
11

放送受信機を一般ではなく別のパッケージに入れていたことがわかるまで、同じ問題が発生しました。

単純に変更:

<receiver android:name=".AndroidAlarmService" android:enabled="true" >

にとって:

<receiver android:name="com.MyCompany.MyPackage.AndroidAlarmService" android:enabled="true" >
于 2013-01-30T22:06:12.490 に答える
0

上記の答えがうまくいかない場合は、期限切れのアラームが発生した ときにコールバックを受け取らない別の方法があります。AlarmManagerあなたは単にこれをチェックする必要があります:のインスタンス化で間違ったものを送ることによってIntentPendingIntent。たとえば、受信者の1つで通話を受信したいが、経由またはonReceiveをインスタンス化したが、実際に意味したのはです。PendingIntentgetActivitygetServicegetReceiver

のインスタンスを作成する場合、それPendingIntentを作成する方法はたくさんあります(getService、、、、:getActivitygetReceivergetForegroundService

Activityインテントの受信者が必要な場合は、次のようにします。

PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*);

BroadcastReceiverインテントの受信者が必要な場合:

PendingIntent.getReceiver(this, 0, intent, PendingIntent.FLAG_*);

フォアグラウンドが必要な場合Serviceは、インテントのレシーバー:

PendingIntent.getForegroundService(this, 0, intent, PendingIntent.FLAG_*);

Serviceインテントの受信者が必要な場合:

PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_*);

また、インテントが正しいクラスを指していることを確認してください。(例:アクティビティ、サービスなどのインテントの作成)。次のように間違って通過した場合、電話はありません。

Intent intent = new Intent(this, MyReceiver.class); // You wanted receiver

// PendingIntent was created in such a way 
// you wanted this to be received by an activity. 
// you will not receive any call if you set it up like this.
PendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_*); 

私もここに同様の答えを投稿しました。

HTH

于 2017-07-14T01:50:07.927 に答える