2016-04-30 17 views
2

アラーム音が鳴ったときにアラームを閉じるために、ユーザーに特定の作業を依頼する目覚まし時計を作っています。正常に機能していますが、問題は、アラームが鳴っている間にユーザーが最近のアクティビティからアラームアプリを閉じると、アラームが鳴らなくなることです。私はそれが鳴っている間、ユーザーがアプリをクリアしても、それが鳴るのを止めてはならない。与えられたタスクが完了したら、それはただ停止するべきです。これをどのように実装できますか?ラムからアラーム音が鳴らなくなったとき

編集#1:アクティビティアラームリングは

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.v(LOG_TAG, "in AlarmAlert"); 
     unlockScreen(); 
     setContentView(R.layout.activity_alarm_alert); 

     Bundle bundle = this.getIntent().getExtras(); 
     alarm = (Alarm) bundle.getSerializable("alarm"); 
     alarmDatabase = new AlarmDatabase(this); 

     //Uri uri = alarm.getRingtonePath(); 
     question = (TextView)findViewById(R.id.question); 
     answer = (TextView) findViewById(R.id.answer); 

     oldColors = answer.getTextColors(); 
     diff = alarm.getDifficulty().toString(); 
     questionString = GenerateMathsQuestion.generateQuestion(diff); 
     question.setText(questionString); 
     actualAnswer = EvaluateString.evaluate(questionString); 
     AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 

     int result = am.requestAudioFocus(focusChangeListener, 
       AudioManager.STREAM_MUSIC, 
       AudioManager.AUDIOFOCUS_GAIN); 

     if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { 
      mediaPlayer = new MediaPlayer(); 
      mediaPlayer.setVolume(1.0f, 1.0f); 
      mediaPlayer.setLooping(true); 
      mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); 

      try { 
       mediaPlayer.setDataSource(this, Uri.parse(alarm.getRingtonePath())); 
       mediaPlayer.prepare(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      mediaPlayer.start(); 
     } 

     if(alarm.getIsVibrate()) { 
      vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 
      long[] pattern = {1000, 200, 200, 200}; 
      vibrator.vibrate(pattern, 0); 
     } 
    } 

public void closeAlarm(){ 
     Log.v(LOG_TAG, "will now stop"); 
     mediaPlayer.stop(); 
     if(vibrator!=null) 
      vibrator.cancel(); 
     Log.v(LOG_TAG, "will now release"); 
     mediaPlayer.release(); 
     Log.v(LOG_TAG, "id of ringing alarm: " + alarm.getAlarmId()); 
     alarm.setIsActive(false); 
     alarmDatabase.updateData(alarm); 
     cursor = alarmDatabase.sortQuery(); 
     while(cursor.moveToNext()){ 
      int id = cursor.getInt(cursor.getColumnIndex(AlarmDatabase.COLUMN_UID)); 
      currentAlarm = alarmDatabase.getAlarm(id); 
      Log.v(LOG_TAG, "id of next alarm " + id); 
      if(currentAlarm != null) { 
       if (currentAlarm.getIsActive() == true) { 
        currentAlarm.scheduleAlarm(this, true); 
        break; 
       } 
      } 
     } 
     this.finish(); 
    } 
+0

このアラームはいつ鳴り止まりますか? – Sibidharan

+0

アクティビティの代わりに、 'extends Service'を使ってサービスにし、' startActivity() 'メソッドの代わりに' startService() 'メソッドを使って起動してください。 – Sibidharan

+0

誰かがレイアウト上の送信ボタンを押すと、closeAlarm関数が呼び出されます。 –

答えて

1

あなたはServicesを使用する必要があるときに呼び出されます。それを見て、それはあなたが望むものです。一般に、操作を実行するようにすることができ、サービスは結果を返しません。しかし、それはあなたがタスクマネージャーか自由なRAMからアプリを殺すときでさえ、無期限に実行されます。

私はこのサービスを読むためにtutorialをお勧めします。

UPDATE

それはレイアウトと話をし、必要なときにアラームを停止することができますので、以下の方法でサービスをあなたの活動を実装します。

public class HelloService extends Service { 
    private Looper mServiceLooper; 
    private ServiceHandler mServiceHandler; 

    // Handler that receives messages from the thread 
    private final class ServiceHandler extends Handler { 
     public ServiceHandler(Looper looper) { 
      super(looper); 
     } 
     @Override 
     public void handleMessage(Message msg) { 
      // Normally we would do some work here, like download a file. 
      // For our sample, we just sleep for 5 seconds. 
      try { 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       // Restore interrupt status. 
       Thread.currentThread().interrupt(); 
      } 
      // Stop the service using the startId, so that we don't stop 
      // the service in the middle of handling another job 
      stopSelf(msg.arg1); 
     } 
    } 

    @Override 
    public void onCreate() { 
    // Start up the thread running the service. Note that we create a 
    // separate thread because the service normally runs in the process's 
    // main thread, which we don't want to block. We also make it 
    // background priority so CPU-intensive work will not disrupt our UI. 
    HandlerThread thread = new HandlerThread("ServiceStartArguments", 
      Process.THREAD_PRIORITY_BACKGROUND); 
    thread.start(); 

    // Get the HandlerThread's Looper and use it for our Handler 
    mServiceLooper = thread.getLooper(); 
    mServiceHandler = new ServiceHandler(mServiceLooper); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show(); 

     // For each start request, send a message to start a job and deliver the 
     // start ID so we know which request we're stopping when we finish the job 
     Message msg = mServiceHandler.obtainMessage(); 
     msg.arg1 = startId; 
     mServiceHandler.sendMessage(msg); 

     // If we get killed, after returning from here, restart 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // We don't provide binding, so return null 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
    Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

しかし、私はそれに関連付ける必要があるレイアウトがあります。だから、基本的には、私の放送受信機は、レイアウトでアシストされたアクティビティを呼び出します。私は何を変えるべきですか? –

+0

アラームを再生する現在のコードを表示します。 – Sibidharan

+0

私はコードを追加しました –

関連する問題