2011-01-27 5 views
1

私のアプリにはいくつかのファイルがありますが、現在は3つしか重要ではありません。アラーム音と通知機能を備えたリマインダーアプリです。 私はcheckboxとそのリスナーを含むmaincode.javaファイルを持っています。ユーザーがChechboxをチェックインすると、AlarmManagerはMyService.javaを起動するAlarmReceiver.javaにインテントを送信します。 MyService javaにはサウンド再生に関するコードが含まれています。コードは部分的です。 MyService.java:Android AlarmManagerとサービスに関する質問

public void onCreate() { 
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onCreate"); 

    player = MediaPlayer.create(this, R.raw.sound); 
    player.setLooping(false); // Set looping 
} 

@Override 
public void onDestroy() { 
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onDestroy"); 
    player.stop(); 
} 

@Override 
public void onStart(Intent intent, int startid) { 
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onStart"); 
    player.start(); 
} 

AlarmReceiver.java:

public void onCreate() { 
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onCreate"); 

    player = MediaPlayer.create(this, R.raw.sound); 
    player.setLooping(false); // Set looping 

maincode.javaの重要な部分:

cb1 = (CheckBox) findViewById(R.id.CheckBox01); 
    cb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
     {   
      if (cb1.isChecked()) 
       { 
       if (GlobalVars.getHourOfDay() >= 0) 
       { 
        Toast.makeText(maincode.this, "ok", Toast.LENGTH_SHORT).show(); 
        rem1.setText(GlobalVars.getReminder1name()); 
         Intent intent = new Intent(maincode.this, AlarmReceiver.class); 
         PendingIntent pendingIntent = PendingIntent.getBroadcast(bInsulinReminder.this, 0, 
          intent, PendingIntent.FLAG_UPDATE_CURRENT); 
         AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
         Calendar cal = Calendar.getInstance(); 
         cal.set(Calendar.HOUR_OF_DAY, GlobalVars.getHourOfDay()); 
         cal.set(Calendar.MINUTE, GlobalVars.getMinute()); 
         cal.set(Calendar.SECOND, 0); 
         cal.set(Calendar.MILLISECOND, 0); 
         alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis()+ 3000, 6000, pendingIntent); 

       } 
       Toast.makeText(maincode.this, "Checked", Toast.LENGTH_SHORT).show(); 
       } else { 
        rem1.setText("No reminder set"); 
        Toast.makeText(maincode.this, "Not checked", Toast.LENGTH_SHORT).show(); 
       } 
     } 

     }); 

(REM1は、テキストの名前に依存リマインダーボタンですユーザーが望むもの)

コードの問題は、私がアラーム、私はそれを停止することはできません。私はMyService.javaにplayer.stop()コマンドがあることを知っていますが、チェックボックスのチェックをはずしたmaincode.javaの最後からどのように呼び出すことができますか?

答えて

3

いいえリスナーから直接行うことはできません。あなたは、アラームをこのように無効にすることができます

Intent intent = new Intent(maincode.this, AlarmReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(bInsulinReminder.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
pendingItem.cancel(); 
alarmManager.cancel(pendingItem); 

場合やAlarmReceiverはBroadcastReceiverの実装であり、onReceive方法から、あなたがサービスクラスの実装であるあなたがMyServiceを開始(私は考え)。

maincode.javaリスナーの内部からこのアラームを止めたい場合は、AlarmReceiverで使用したPendingIntentを再作成しstopServiceメソッドを実行するだけでMyServiceを停止できます。

希望に役立ちます。

関連する問題