素人のアンドロイドアプリ開発日記

Serviceのコンテンツ

Serviceで駐在のアプリ作成。ACTION_BOOT_COMPLETED利用

2011.12.13

最近、更新頻度がアップしてきましたが、連続した範囲なので、まとめて呼んでもらった方が理解が深まるかもしれません。

 

今回は、駐在アプリの作り方を勉強します。

Serviceを利用している場合に、常にユーザーの情報を取得する必要がある場合でも、実行後に、電源を切ってしまうと、動作しなくなってしまう場合があります。

再起動もしないはずです。サービスは起動中であれば、メモリの空き次第によって再起動をするのですが、そうでない場合には、再起動はしないようです。

この場合、Receiverで、アンドロイドの起動時に、Serviceを呼び出す事で、Serviceを基本的には常に実行させる事ができます。

BroadCastReceiverでは、最初にmanifest.xmlを変更する必要があります。起動時のイベントを取得する為にintent-filterを用います。

<receiver android:name="BoostReceiver" android:process=":remote">
 <intent-filter>
 <action android:name="android.intent.action.BOOT_COMPLETED"/>
 </intent-filter>
</receiver>

BOOT_COMPLETEDが取得したイベントです。

BoostReceiverでは次のような形で、アクションが起動したものであれば、SampleServiceを呼び出す。と言う仕様にして実行をします。

public class BoostReceiver extends BroadcastReceiver{
 @Override
 public void onReceive(Context context, Intent intent) {                
 String action = intent.getAction();
 if(action.equals(Intent.ACTION_BOOT_COMPLETED)){
 Toast.makeText(context, "起動をしたのでサービスを開始します。", 1200).show();
 context = context.getApplicationContext();
 Intent service = new Intent(context, SampleService.class);
 context.startService(service);
 }
 }
}

これで、アンドロイド起動の際にサービスを起動させる事ができ、かつ、駐在のアプリを作成する事ができるようになりました。

 

以上です。

カテゴリー:Service

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

2011.12.13

前回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を使う方法が推奨です。

 

以上です。

カテゴリー:Service

Serviceを使いたい。はじめの一歩

2011.12.09

目覚ましアラームや、定期的なサーバー通信とか、したいと思うのですが、Serviceについての記述がややこしいので、ちょっと自分メモを数回に分けてまとめておきます。

今回はbindと言う関数は無視します!serviceだけ。

 

まず、最初に

/*————–
サービスとは
————–*/

動き続ける、画面を持たない。つまりは、一度起動をしてしまうと、

サービス.stopSelf()

も利用ができるのですが、基本的には、とまらず、そこで動き続けるイメージです。

(かなりの付加がかかる場合には、stopしたいですが。。)

 

/*—————-
とりあえず、使ってみる。
—————–*/

serviceをとりあえず、使ってみます。

SpecialService.java

public class SpecialService extends Service {
 @Override
 public void onCreate() {
 Toast.makeText(this, "こんにちわ", Toast.LENGTH_LONG),show();
 super.onCreate();
 }
}

上記のサービスを作成して、manifest.xmlに下記を追加します。

<service android:name=".SpecialService"></service>

で、これを起動中のアクティビティを呼びます。

MainActivity.java

Intent intent = new Intent(this, SpecialService.class);
startService(intent);

上記で、動きました!!

 

/*——–
で??
——–*/

と言う状況になります。

実は、継続する動作に関して利用をする事に効果を発揮するのが、Serviceらしいです。

 

/*———————-
timerで継続させてみる。
———————–*/

※すいません。onStart()に書いたscheduleですが、タスクキラーとかにbanされてしまったあと実行される時にonCreateしか実行されないで、onStartは実行されない可能性もありそうなので、onCreateに書いてもいいかもしれない

private Toast _toast =  null;

@Override
public void onCreate() {
 _toast = Toast.makeText(this, "showをしないであらかじめつくっておく。", Toast.LENGTH_LONG);
 super.onCreate();
}

@Override
public void onStart(Intent intent, int startId) {
 schedule(10000);
 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秒後に

「showをしないであらかじめつくっておく。」

とToastがでました。

ですが、これもActivityにもある機能です。

Serviceの動作を確認する為には、Srviceを起動した後に、アプリを終了します。

 

そうすると、10秒後に

「showをしないであらかじめつくっておく。」

が表示されました。

 

/*————————–
timerを繰り返し設定する
————————–*/

timer.schedule(timerTask, delay,delay);

とします。

private Toast _toast =  null;

@Override
public void onCreate() {
 _toast = Toast.makeText(this, "繰り返す。", Toast.LENGTH_LONG);
 super.onCreate();
}

@Override
public void onStart(Intent intent, int startId) {
 schedule(10000);
 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,delay);
}

毎10秒後とに「繰り返す。」が実装されます。
このServiceの機能をやめる為には、設定からアプリを終了するか、電源を落とすかになります。

 

ちょっと迷惑なアプリができてしまいますが。以上です。

 

一部不具合がありましたので、下記にて補完しております。

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

カテゴリー:Service

公開中のアプリ、是非ダウンロードしてみてください

2chまとめのたね

RSSを利用してさまざまなブログの情報をキュレーションしてくれるアプリ

インストールする

ひらがな戦記

OPENGL ES2 を利用したカルタのソーシャルゲーム

インストールする