Serviceを使いたい。時間の管理をする。

前回Serviceを作成した時には、10秒に一度実行をさせる方法を書いていたのだけど、たまに、10秒に一度実行されなくなる時がありました。僕の場合は、タスクキラーの起動直度にServiceが止まってしまうようでした。

調べてみると、サービス機能は、タスクキラーのほかにも、アンドロイドのメモリが少なくなってきた時に、動作がストップされる事があるそうです。また、サービスはメモリに余裕が出てくると、再起動を行うのですが、

onCreateを実行するのですが、
onStartは実行されないようです。

onStartはstartServiceが呼ばれた場合にのみ呼ばれる値のようで、再起動の際には、利用されないとの事でした。

その事を踏まえつつ、onCreateに多くの関数を実装させて、onStartは空にしました。

private Toast _toast =  null;  
 
 @Override  
 public void onCreate() {  
 _toast = Toast.makeText(this, "showをしないであらかじめつくっておく。", Toast.LENGTH_LONG);  
 schedule(10000);
 super.onCreate();  
 }  
 
 @Override  
 public void onStart(Intent intent, int startId) {  
 
 super.onStart(intent, startId);  
 }  
 
 
 public void schedule(long delay) {  
 if (timer != null) {  
 timer.cancel();  
 }  
 timer = new Timer();  
 TimerTask timerTask = new TimerTask() {  
 public void run() {  
 _toast.show();  
 }  
 };  
 timer.schedule(timerTask, delay);  
 }

で、上記が10秒に一度の実行ができたので、これを3時間に一度とかにしてみます。

private Toast _toast =  null;  
 
 @Override  
 public void onCreate() {  
 _toast = Toast.makeText(this, "showをしないであらかじめつくっておく。", Toast.LENGTH_LONG);  
 schedule(1000*60*3);
 super.onCreate();  
 }  
 
 @Override  
 public void onStart(Intent intent, int startId) {  
 
 super.onStart(intent, startId);  
 }  
 
 
 public void schedule(long delay) {  
 if (timer != null) {  
 timer.cancel();  
 }  
 timer = new Timer();  
 TimerTask timerTask = new TimerTask() {  
 public void run() {  
 _toast.show();  
 }  
 };  
 timer.schedule(timerTask, delay);  
 }

scheduleを3時間に設定しました。上記にすると、実行がされませんでした。3時間経っても。※人によっては、実行されます。多分

僕の方でタスクキラーが、30分に一度の設定がされていました。なので、その度に値がリセットされているようでした。

 

これを解決する方法は、alarmManagerを利用する事で解決ができるのですが、ちょっと違う方法でも解決できたのでその方法を記したいと思います。

/*—————–
かなり無理やりです。
—————–*/

今回は、Timerで解決をしてみたいと思います。

まず、多くのタスクキラーで、数分に一度のタスクキラー実行を備えていると考えます。タスクキラーで、停止されたサービスも数十秒後には起動している事が多いので、最初に30秒に一度実行のサービスを作成します。

schedule(1000*30);

でカウントをします。

_count = 0;

毎回

_count++;

2回で、1分 120回で60分 360回で3時間

if(_count%360 == 0){}

でカウントが360の倍数の場合を取得できるので、3時間ごとに実行をする関数ができます。

ですが、private で値を設定してしまうと、再起動の際に初期化されてしまい、0からスタートになるので、Preferenceに保存をします。(倍数の部分もちょっと変えてますが。。)

private static final String PREFERRENCES_FILE_NAME = "PrefrencesFile";
private static final String PREFERRENCES_NUM = "PrefrencesFile";
private int _count;
@Override
 public void onCreate() {
 pref = getSharedPreferences(PREFERRENCES_FILE_NAME, MODE_PRIVATE);
 _count = pref.getInt(PREFERRENCES_NUM, 0);
 schedule(1000*30);
 super.onCreate();
 }

public void schedule(long delay) {
 if (timer != null) {
 timer.cancel();
 }
 timer = new Timer();
 TimerTask timerTask = new TimerTask() {
 public void run() {
 mHandler.post(new Runnable() {  
 public void run() {  
 _count++;
 if(_count%360 == 0){
 _count = 0; 
 }
 
 Editor e = pref.edit();
 e.putInt(PREFERRENCES_NUM, _count);
 e.commit();
 
 if(_count == 0){}
 }
 });
 
 }
 };
 timer.schedule(timerTask, delay,delay);
}

上記の方法では、サービスが停止している可能性もあるので、約3時間で実行される関数ができました。

ちょっとむりやりですが、こんな方法もある。と言う事で紹介させていただきました。

※alarmManagerを使う方法が推奨です。

 

以上です。

前後の記事

前の記事:

次の記事:

関連の記事

コメントの投稿

  • サイト内検索

新作アプリの紹介

関連サイトの紹介

アンドロイドアプリ開発TIPS
きぐるみカメラ
ふらいぱん
アンドロイドのデザイン集
Page top↑