私のやりたいことは、定期的にあるアクションが起動するアプリの作成です。
serviceでいいかと思っていたのですが、何故か画面がスリープした状態で停止します。
そこでAlarmManagerを使用する方法に切り替えることにしました。
とりあえずsetRepeatingを使用すれば実現できそうです。
ここではAlarmManagerの詳細は省略です。。。
cancelでAlarmManagerが停止しない!
かなり困ったのですが、setActionがキーのようです。
呼び出し時と同じAction名でcancelしてやればいいようです。
BroadcastReceiverからActivityへ返したい
たんなるタイマーに使いたいだけですので、所定時間が経過すればActivityに処理を戻したいのですが、
どうすればよいかわかりません・・・。
あきらめて、BroadcastReceiverからPendingIntentを投げることにしました。
しかしこれでは、毎回onCreateが呼ばれるので、intentのアクションで処理を分けることにしました。
画面が毎回揺れるのは、とりあえずほっておくことにしました。
タイマーでカウントアップしたい
この方法ではAlarmによってBroadcastReceiverが呼ばれるのはonReceive。
BroadcastReceiverからActivityが呼ばれるのはonCreate。
どちらも変数が初期化されてしまい、うまくいきません。。。
プリファレンスあたりを使用して、カウンターの数を保存しておくことにする予定です。
とりあえず、AlarmManagerを使って呼び出し元のActivityをキックするサンプルです
不要なコードもついていますが、そろそろ整理不能になってきたので動作している間に・・・ :x001:
AlarmActivity.class
package com.nekotype; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; public class AlarmActivity extends Activity { AlarmManager alarmManager = null; PendingIntent pendingIntent = null; final int ADD_COUNT= 15000; int count = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.alarm_main); Log.v("AlarmActivity", "onCreate"); Button btnStart = (Button)findViewById(R.id.btnStart); btnStart.setOnClickListener((android.view.View.OnClickListener) new btnStartClickListener()); Button btnEnd = (Button)findViewById(R.id.btnEnd); btnEnd.setOnClickListener((android.view.View.OnClickListener) new btnEndClickListener()); Intent getintent = getIntent(); if (getintent != null ){ Log.v("AlarmActivity", getintent.getAction()); if (getintent.getAction().equals("RETURN")){ Bundle extra = getIntent().getExtras(); try { this.count += Integer.parseInt(extra.getString("count")) ; Log.v("AlarmActivity", String.valueOf(this.count) ); } catch (Exception e) { Log.v("AlarmActivity", e.toString()); } } Toast.makeText(this, "AlarmActivity", Toast.LENGTH_SHORT).show(); } Context context = AlarmActivity.this; Intent intent = new Intent(AlarmActivity.this,ReceivedActivity.class); //setActionを指定し、同じaction名でcancelしないと止まりません intent.setAction("REPEAT"); intent.putExtra("count", ADD_COUNT); pendingIntent = PendingIntent.getBroadcast(context, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT); alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); } class btnStartClickListener implements android.view.View.OnClickListener{ @Override public void onClick(View arg0) { Log.v("AlarmActivity", "click start"); long currentTimeMillis = System.currentTimeMillis(); alarmManager.setRepeating(AlarmManager.RTC, currentTimeMillis+1000, ADD_COUNT, pendingIntent); } } class btnEndClickListener implements android.view.View.OnClickListener{ @Override public void onClick(View arg0) { Log.v("test","click end"); try { alarmManager.cancel(pendingIntent); } catch (Exception e) { // TODO: handle exception Log.v("test",e.toString()); } } } }
ReceivedActivity.java
package com.nekotype; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.PendingIntent.CanceledException; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.RemoteException; import android.sax.StartElementListener; import android.util.Log; import android.widget.TextView; import android.widget.Toast; public class ReceivedActivity extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.v("ReceivedActivity", "onCreate"); Bundle extra = intent.getExtras(); int count = extra.getInt("count"); Intent intent2 = new Intent(context, AlarmActivity.class); intent2.setAction("RETURN"); intent2.putExtra("count", String.valueOf(count)); Log.v("ReceivedActivity", String.valueOf(count)); PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent2, 0); try { pIntent.send(); } catch (CanceledException e) { e.printStackTrace(); } } }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.nekotype" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".AlarmActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".ReceivedActivity" android:process=":remote" /> <receiver android:name=".AlarmActivity" android:process=":remote" /> </application> </manifest>
layoutは省略・・・