0

アラーム マネージャーを使用して、異なる時間に 3 つのアラームをトリガーしようとしています。これが私のコードです (alarm1、alarm2、alarm3 は、私のコードで以前に設定された 3 つのカレンダー オブジェクトであることに注意してください):

AlarmNum=1;
new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub

            // TODO Auto-generated method stub
            Intent myIntent = new Intent(MainActivity.this,
                    MyAlarmService.class);
            pendingIntent = PendingIntent.getService(MainActivity.this, 0,
                    myIntent, 0);

            if (AlarmNum == 1)
                alarmManager.set(AlarmManager.RTC_WAKEUP,
                        alarm1.getTimeInMillis(), pendingIntent);
            else if (AlarmNum == 2)
                alarmManager.set(AlarmManager.RTC_WAKEUP,
                        alarm2.getTimeInMillis(), pendingIntent);
            else
                alarmManager.set(AlarmManager.RTC_WAKEUP,
                        alarm3.getTimeInMillis(), pendingIntent);

            Toast.makeText(MainActivity.this, "Start Alarm",
                    Toast.LENGTH_LONG).show();
        }
    };

上記のコードでは、以下に示す MyAlarmService クラスを呼び出すインテントを開始します。

public class MyAlarmService extends Service {
MainActivity instance;
MediaPlayer mp;

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    Toast.makeText(this, "MyAlarmService.onCreate()", Toast.LENGTH_LONG)
            .show();
    mp = MediaPlayer.create(this, R.raw.alarmtone);
    instance = new MainActivity();
}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    Toast.makeText(this, "MyAlarmService.onBind()", Toast.LENGTH_LONG)
            .show();
    return null;
}

@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG)
            .show();
}

@Override
public void onStart(Intent intent, int startId) {
    // TODO Auto-generated method stub
    super.onStart(intent, startId);
    Toast.makeText(this, "MyAlarmService.onStart()", Toast.LENGTH_LONG)
            .show();
    mp.start();
    instance.setAlarmNum(instance.getAlarmNum() + 1);
}

@Override
public boolean onUnbind(Intent intent) {
    // TODO Auto-generated method stub
    mp.release();
    mp.reset();
    Toast.makeText(this, "MyAlarmService.onUnbind()", Toast.LENGTH_LONG)
            .show();
    return super.onUnbind(intent);
}

トーストが表示されず、アラームも表示されないため、ここに問題があると思います。

4

1 に答える 1

0

あなたのコードとコメントから私が理解したのは、最初のアラームで 2 番目のアラームをトリガーし、2 番目のアラームで 3 番目のアラームをトリガーするということです。

あなたのコードで気づいたいくつかの問題。

1) これはアクティビティを開始する間違った方法です。うまくいきません:

instance = new MainActivity();

代わりに、次のようにする必要があります。

Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(url));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

上記の問題に関係なく、アラームがトリガーされるたびに MainActivity を開始する必要はありません。サービス内で新しいアラームをトリガーするだけです。ここでは、2 番目のアラーム トリガー時刻が 1 番目よりも遅く、3 番目が 2 番目よりも遅いなどと想定しています。そうでない場合、アルゴリズムは機能しません。

アクティビティで最初のアラームが設定されます:

Intent myIntent = new Intent(MainActivity.this, MyAlarmService.class);
myIntent.addExtra("AlarmNum",1);
PendingIntent pendingIntent = PendingIntent.getService(MainActivity.this, 0,
                    myIntent, 0);

alarmManager.set(AlarmManager.RTC_WAKEUP,alarm1.getTimeInMillis(), pendingIntent);

サービスが以前に設定されたアラームを理解できるように、インテントに整数を追加したことに注意してください。

サービスの onBind 関数に戻り、インテントからこのエクストラを読み取る必要があります。

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
...
int AlarmNum = intent.getIntExtra("AlarmNum",0);
...
    return null;
}

次に、AlarmNum の値を確認し、値に応じて、同じ方法で次のアラームを設定します (AlarmNum == 1 の場合、2 番目のアラームを設定し、インテントのエクストラを 1 ずつ増やします)。設定するアラームが 3 つあるため、3 と表示された場合は、何もせずにサービスを完了します。

余談ですが、ハンドラーを使用してサービスでトースト メッセージを表示することをお勧めします。

于 2012-07-21T21:21:40.167 に答える