アプリケーション終了時に、メモリから消すには?

5,070 views
Skip to first unread message

morishima

unread,
Jun 2, 2010, 7:02:13 AM6/2/10
to 日本Androidの会
morishimaと申します。

アプリケーションをfinish()で終了させても、タスクマネージャのリストに残ってしまいます。
アプリケーションを完全にKillするにはどうすればいいのでしょうか?

ActivityManager#restartPackageで自分のアプリケーションを指定する方法では、
onPause() やonDestroy() が呼ばれなくなってしまいました。


終了させるとメモリ上から消え、タスクマネージャに載らなくなるアプリケーションがあったため、
何か方法があるものと思うのですが、方法に行き着くことができませんでした。
ご存知の方、情報をお願いします。

Yusuke Urabe

unread,
Jun 3, 2010, 9:33:09 PM6/3/10
to android-g...@googlegroups.com
浦部@DS富津店です。

携帯からなので読み辛いかもしれませんがお許し下さい。

参考になるかどうか解りませんが、ボタンが少なくてバックグラウンドで
起動できるという特徴を活かしてアプリ終了時には、ユーザーが選択でき
るようになればいいなぁとおもいます。

いい例としては、"sky fire"というブラウザがあるのですが、基本
的にはバックグラウンドで起動しています。しかしアプリ終了時には、戻
るボタン長押しでポップアップが出てプロセスが切れるようになっていま
す。

以上ユーザー目線で申し訳ないですがご参考になればと思います。


On 2010/06/02, at 20:02, morishima <morish...@gmail.com> wrote:

> morishimaと申します。
>
> アプリケーションをfinish()で終了させても、タスクマネージャ
> のリストに残ってしまいます。
> アプリケーションを完全にKillするにはどうすればいいのでしょ
> うか?
>
> ActivityManager#restartPackageで自分のアプリケーションを指定する
> 方法では、
> onPause() やonDestroy() が呼ばれなくなってしまいました。
>
>
> 終了させるとメモリ上から消え、タスクマネージャに載らなくなるアプ
> リケーションがあったため、
> 何か方法があるものと思うのですが、方法に行き着くことができません
> でした。
> ご存知の方、情報をお願いします。
>
> --
> このメールは Google グループのグループ「日本Android
> の会」の登録者に送られています。
> このグループに投稿するには、android-group-
> ja...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-japan
> +unsub...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-
> japan?hl=ja からこのグループにアクセスしてください。
>

EGAWA Takashi

unread,
Jun 3, 2010, 9:54:07 PM6/3/10
to android-g...@googlegroups.com
江川です。
本当に問題がないかどうかはソースを確かめていないのでわからないのですが、
ActivityのonPauseやonStopでfinishし、onDestroyの最後で(super呼んでから)System.exitする
という手もあると思いますがいかがでしょうか?
------------------------------------------
EGAWA Takashi

2010年6月2日20:02 morishima <morish...@gmail.com>:

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

morishima

unread,
Jun 4, 2010, 3:16:03 AM6/4/10
to android-g...@googlegroups.com
浦部さん

返信ありがとうございます。

確かに、よく使うものは毎回終了されないほうが、マルチタスクのメリットが感じられますね。
終了するのか、バックグラウンドにしまうのか、選択肢を残しておくというのはとても理にかなったことだと思います。
DolphinBrowserもそのような実装でした。


ただ今回は、選択肢を用意する以前の問題、
つまりプロセスを切る方法がわからなくて困っています(汗)
これができないと選択してもらうこともできません。。。

引き続き、情報をお待ちしています。


2010年6月4日10:33 Yusuke Urabe <yusuk...@gmail.com>:
浦部@DS富津店です。

携帯からなので読み辛いかもしれませんがお許し下さい。

参考になるかどうか解りませんが、ボタンが少なくてバックグラウンドで起動できるという特徴を活かしてアプリ終了時には、ユーザーが選択できるようになればいいなぁとおもいます。

いい例としては、"sky fire"というブラウザがあるのですが、基本的にはバックグラウンドで起動しています。しかしアプリ終了時には、戻るボタン長押しでポップアップが出てプロセスが切れるようになっています。

以上ユーザー目線で申し訳ないですがご参考になればと思います。





On 2010/06/02, at 20:02, morishima <morish...@gmail.com> wrote:

morishimaと申します。

アプリケーションをfinish()で終了させても、タスクマネージャのリストに残ってしまいます。
アプリケーションを完全にKillするにはどうすればいいのでしょうか?

ActivityManager#restartPackageで自分のアプリケーションを指定する方法では、
onPause() やonDestroy() が呼ばれなくなってしまいました。


終了させるとメモリ上から消え、タスクマネージャに載らなくなるアプリケーションがあったため、
何か方法があるものと思うのですが、方法に行き着くことができませんでした。
ご存知の方、情報をお願いします。

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

morishima

unread,
Jun 4, 2010, 3:52:36 AM6/4/10
to android-g...@googlegroups.com
自己レスとなります。

もしかしてと思い、浦部さんのおっしゃった「プロセス」で検索をかけたところ
android.os.Process#killProcess(int PID)
というメソッドを見つけました。

他のアプリケーションでも同じようなログが出ていたため、
このメソッドで「完全終了」を実現しているものと考えております。

しかし、このメソッドも通常の終了処理(onPause、onDestroyなど)を通らずにアプリケーションを終了します。
ログに以下のような出力があり、
WIN DEATH: Window{パッケージ/アクティビティ名 paused=false}
onPauseを通すことができるのかもな、と思いました。

まだAPIを読み進めていないのでこれ以上のことはわかりませんが、糸口は見つけられたと思います。
とりあえず、ご報告まで。


2010年6月4日16:16 morishima <morish...@gmail.com>:

宮山

unread,
Jun 7, 2010, 2:13:53 AM6/7/10
to 日本Androidの会
こんにちは、宮山です。

System.exit(0)でアプリが終了することが出来ました。

実はこのコマンドを知らなくて今まで

 Process.killProcess(Process.myPid());

という感じで自分のプロセスを殺してました。

私のやっているプログラムでは、大量にbimapを扱うせいか終了時に
自分を殺しておかないと起動、終了を繰り返しているうちにメモリ不足で
エラーになってました。

この辺、2.2になったら改善されるんでしょうか?

以上、よろしくお願いいたします。

On 6月4日, 午前10:54, EGAWA Takashi <e...@android-group.jp> wrote:
> 江川です。
> 本当に問題がないかどうかはソースを確かめていないのでわからないのですが、
> ActivityのonPauseやonStopでfinishし、onDestroyの最後で(super呼んでから)System.exitする
> という手もあると思いますがいかがでしょうか?
> ------------------------------------------
> EGAWA Takashi
>
> 2010年6月2日20:02 morishima <morishima0...@gmail.com>:

長井成実

unread,
Jun 7, 2010, 4:34:31 AM6/7/10
to android-g...@googlegroups.com
長井といいます。

その状態だと、端末を縦、横の繰り返しでメモリ不足になりませんか?
エミュレータなら「Ctrl(左)+F12」でテスト出来ます。

bitmap.recycle();

を適切な場所で発行しないといけないと思うのですが。。。


> こんにちは、宮山です。
>
> System.exit(0)でアプリが終了することが出来ました。
>
> 実はこのコマンドを知らなくて今まで
>
> Process.killProcess(Process.myPid());
>
> という感じで自分のプロセスを殺してました。
>
> 私のやっているプログラムでは、大量にbimapを扱うせいか終了時に
> 自分を殺しておかないと起動、終了を繰り返しているうちにメモリ不足で
> エラーになってました。
>
> この辺、2.2になったら改善されるんでしょうか?
>
> 以上、よろしくお願いいたします。
>
> On 6月4日, 午前10:54, EGAWA Takashi <e...@android-group.jp> wrote:
>> 江川です。
>> 本当に問題がないかどうかはソースを確かめていないのでわからないのですが、
>> ActivityのonPauseやonStopでfinishし、onDestroyの最後で(super呼んでから)System.exitする
>> という手もあると思いますがいかがでしょうか?
>> ------------------------------------------
>> EGAWA Takashi
>>

--
====================
Narumi NAGAI
====================

SIA

unread,
Jun 7, 2010, 8:35:22 AM6/7/10
to android-g...@googlegroups.com
お世話になっています。
今、AnimationDrawableを切り替えながら動作するソフトを作って
います。
最初に全部読んで展開できればいいのですが、全部読むとOutOfMemory
が発生してしまうので、逐次ワーカースレッドでgetDrawableで読
み直していますが、読み直すとき、GCが発生してアニメーションが
カクついてしまいます。

同じアニメーションをgetDrawableするとGCは発生しないの
で、このgetDrawableで取得したリソースをこちらのスレッドで解
放できれば改善すると考えています。

このgetDrawableで取得したリソースを解放するにはどうしたらよ
ろしいでしょうか?
方法がありましたら教えてもらえると助かります。

よろしくお願います。
>>
>>
>>
>>
>>
>>
>>
>>

森川 浩志

unread,
Jun 7, 2010, 10:31:20 AM6/7/10
to android-g...@googlegroups.com
森川です.

Bitmapを扱う際の OutOfMemoryError については,
日高正博さんが, まとめられています. 参考まで.

http://d.hatena.ne.jp/hdk_embedded/20100518

# 日本アンドロイド会 関西支部 マニアック勉強会での発表資料

iPadから送信

宮山

unread,
Jun 8, 2010, 3:41:26 AM6/8/10
to 日本Androidの会
To:長井さん

こんにちは、宮山です。

> その状態だと、端末を縦、横の繰り返しでメモリ不足になりませんか?
> エミュレータなら「Ctrl(左)+F12」でテスト出来ます。
>
> bitmap.recycle();
>
> を適切な場所で発行しないといけないと思うのですが。。。

アプリというかコンテンツの都合で縦横はコンテンツサイズに依存する作りに
してます。ですので端末の縦横切り替えは無効にしてます。

最初bitmap.recycle()も疑ったのですがそれでもだめでした。

@hyoromoさんも同じ事ではまっていたので色々話し合ってみたんですが
どうもそれとは違うようです。
日高正博さんの資料も二人共チェック済みだったのですが、違うプログラムで
色々試しても同じ現象にぶち当たっていました。
お互いプログラム実行中にOutOfMemoryになる事が無いようなので、
NativeHeapの方を使い切っているのでしょうか?

だとするとOS側の問題なので諦めるしかなさそうなんですが…

以上、よろしくお願いいたします。

morishima

unread,
Jun 8, 2010, 11:18:51 PM6/8/10
to android-g...@googlegroups.com
宮山さん

morishimaです。
自分は、独自ViewのonDraw内でinvalidateを呼び出すようなロジックを
書いてしまったとき、Activityを終了しても
Allocateされたメモリが解放されなくなることがありました。

まったく見当違いかもしれませんが。


2010年6月8日16:41 宮山 <mry...@gmail.com>:

Cuma@

unread,
Jun 9, 2010, 10:31:58 AM6/9/10
to 日本Androidの会
To:宮山さん

渡邉と申します。

検討違いかもしれませんが、
以下のように、ビットマップのリサイクルの直後に、強制的にGCを1回~2回程度
走らせてみてください。これで、上手く行く場合があります。

bitmap.recycle()
bitmap = null
System.gc()

どうも、bitmap.recycle()とGCが走るタイミングは
異なっているようで、極度にヒープが枯渇している場合
GC手動で実行しないとOutOfMemoryが出るようです。

ちなみに、この手法ですがAndroidのFW側やプリインアプリでも
使っていたりするので、それ程トリッキーな手段では無さそうです。

これでも駄目な場合、該当オブジェクトの参照が外れているかの
確認をしてみてください。

宮山

unread,
Jun 10, 2010, 2:45:00 AM6/10/10
to 日本Androidの会
こんにちは、宮山です。

纏めてレスさせて頂きます。

morishimaさん>
>自分は、独自ViewのonDraw内でinvalidateを呼び出すようなロジックを
>書いてしまったとき、Activityを終了しても
>Allocateされたメモリが解放されなくなることがありました。
そういったロジックは使っていません。

渡邉さん>
>検討違いかもしれませんが、
>以下のように、ビットマップのリサイクルの直後に、強制的にGCを1回~2回程度
>走らせてみてください。これで、上手く行く場合があります。
>bitmap.recycle()
>bitmap = null
>System.gc()
真っ先に疑ってアプリ終了時にはbitmapのメンバ変数全てに対して上記のような処理を
入れてみたのですが現象は変わりませんでした(TT)

以前にロングランテストを実施しているのですが、アプリを立ち上げたままであれば
ScreenLockに入ったり他のアプリと切り替えたりしながら数時間連続で動かしても
OutOfMemoryで異常終了することはありませんでした。

以上、よろしくお願いいたします。
Reply all
Reply to author
Forward
0 new messages