Loading...

android-group-japan@googlegroups.com

[Prev] Thread [Next]  |  [Prev] Date [Next]

Re: [android-group-japan: 16895] Alarmのプロセ スが毎回異なる問題 Nikolay Elenkov Thu Feb 16 19:00:52 2012

2012/2/17 takeshi honda <[EMAIL PROTECTED]>:
> 以下のサイトのように、AlarmManagerを使って、一定時間ごとにBroadcastReceiverを呼び出して処理を行なっています。
>
> http://y-anz-m.blogspot.com/2011/03/alarmmanager.html
>
...
>
> 負荷の大きい処理を行わせると、Receiverが呼び出されるごとに新たなプロセスが発生します。

負荷の多いときは、おそらくアプリのプロセスが存在していません。
そのため、Receiverを起動するために、新しいプロセス(p1)が作られて、
onReceive()が呼ばれています。次のアラームが発生したときに、
p1がもうなくなっているので、また新しいプロセスが作られます。
そのため、PIDが毎回異なります。

>
> 処理時間がalarmの周期を超えるとおかしくなるのかと思い、alarmの周期を長めにとって1時間にしてみたのですが、
> やはり別々のプロセスが発生してしまいます。alarmの周期を変えたり、負荷の大きさを変えたり試したのですが、いまいち現象の発生が不規則で、どう
> いう時に別プロセスになるのかがよくわかりません。

以下のコマンドでプロセスでアプリのプロセスがあるのか、と
プロセスなどのかなり詳しい情報が得られるので、デバッグ
に有利でしょう。

$adb shell ps|grep org.myapp
$adb shell dumpsys


>
> Receiverが別々のプロセスで実行されると、アプリが予測できない動きをするので、出来れば最初の例のように同一プロセスで実行させたいのです
> が、どうしたら負荷の大きい処理を同一プロセスで実行できるでしょうか?

これは、おそらく、アプリのバグなので、直したほうがいいでしょう。

>
> 以下ソースです。よろしくお願いします。
>

> public class Receiver extends BroadcastReceiver {
>        @Override
>        public void onReceive(Context context, Intent intent) {
>                Log.d("study", "onReceive:"+this);
>
>                // 時間の掛かる処理
>                taketime();


onReceive() で時間のかかる処理を実行してはいけません。
重い処理をする場合は、IntentServiceとかを起動するのは、
通常のパターンです。onReceive()が返したら、プロセスが
殺される可能性は高いので、Thread は使えません。

http://developer.android.com/reference/android/content/BroadcastReceiver.html#ProcessLifecycle
http://developer.android.com/reference/android/content/BroadcastReceiver.html#onReceive(android.content.Context,
android.content.Intent)

-- 
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
[EMAIL PROTECTED] にメールを送信してください。
[EMAIL PROTECTED] にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja 
からこのグループにアクセスしてください。