Process xxxx has died.

5,382 views
Skip to first unread message

takeshi honda

unread,
Mar 3, 2012, 10:02:04 PM3/3/12
to 日本Androidの会
Alarmで定期的に処理を行うプログラムを作成しています。
定期的に行う処理は
・int counter++
・GPSの値を取得
・通信でサーバーに送る
くらいです。

このプログラムだけ動かしている分には問題なく動作するのですが、
例えばブラウザで重いページを見たりして端末に負荷をかけたような場合、

I/ActivityManager( 1178): Process jp.local.hello (pid 1970) has died.

というメッセージがでて、プロセスが殺されてしまいます。その後すぐ、

I/ActivityManager( 1178): Start proc jp.tytlabs.cyc.app.tlog for
broadcast jp.local.hello/.MainAlarm: pid=4075 uid=10117 gids={3003,
1015}

メッセージがでて、プロセスが再起動されるようです。
再現性は低く、起きたり起きなかったりします。
これが起こるとcounterの値が0に戻ったりして、プログラムが正しく動作しません。

以下にこの辺りのlogcatをコピペしますが、何が問題なのでしょうか?
どうしたらこの再起動を起こさなくできるでしょうか?

---------------------------------------------------

D/NetworkLocationProvider( 1178): onDataConnectionStateChanged 8


D/MobileDataStateTracker( 1178): default Received state= CONNECTED,
old= CONNECTING, reason= pdpReset, apnTypeList= default,supl


D/NetworkStateTracker( 1178): setDetailed state, old =CONNECTING and
new state=CONNECTED


D/ConnectivityService( 1178): ConnectivityChange for MOBILE: CONNECTED/
CONNECTED


E/NetworkStateTracker( 1178): net.tcp.buffersize.hsdpa not found in
system properties. Using defaults


V/NetworkStateTracker( 1178): Setting TCP values:
[4096,87380,110208,4096,16384,110208] which comes from
[net.tcp.buffersize.default]


D/ConnectivityService( 1178): adding dns 220.159.212.200 for MOBILE


D/ConnectivityService( 1178): adding dns 220.159.212.201 for MOBILE


I/MediaUploader( 1271): No need to wake up


I/OnlineReceiver( 1327): Receiver onConnectivity


D/OnlineReceiver( 1327): Broadcast: Network Up


V/AutoSyncService( 1721): onCreate()


I/OnlineService( 1327): OnlineService onCreate


D/MobileDataStateTracker( 1178): replacing old mInterfaceName (rmnet0)
with rmnet0 for supl


D/GpsLocationProvider( 1178): updateNetworkState available info:
NetworkInfo: type: MOBILE[HSDPA], state: CONNECTED/CONNECTED, reason:
pdpReset, extra: mpr2.bizho.net, roaming: false, failover: false,
isAvailable: true


D/GpsLocationProvider( 1178): NetworkThread wait for 10179802ms


I/OnlineService( 1327): OnlineService onStart


V/AutoSyncService( 1721): onStart(): action_auto_sync_event[3]


V/AutoSyncService( 1721): onDestroy()


I/OnlineService( 1327): OnlineService onDestroy


I/GTalkService( 1325): [ServiceAutoStarter] --- start GTalk service
---


I/wpa_supplicant( 1237): CTRL-EVENT-STATE-CHANGE id=-1 state=1


V/WifiMonitor( 1178): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=1]


V/WifiStateTracker( 1178): Changing supplicant state: SCANNING ==>
INACTIVE


D/NetworkStateTracker( 1178): setDetailed state, old =SCANNING and new
state=IDLE


D/ConnectivityService( 1178): Dropping ConnectivityChange for WIFI:
DISCONNECTED/IDLE


V/Hello ( 1970): timeout:1


V/Hello ( 1970): Observation 314 end


D/LocationManager( 1970): removeUpdates: listener =
jp.local.hello.MainService@45ac7ec0


D/NetworkLocationProvider( 1178): removeListener(): jp.local.hello


D/GpsLocationProvider( 1178): stopNavigating


D/NetworkLocationProvider( 1178): enableLocationTracking(): false


E/NetworkLocationProvider( 1178): releaseCheckLocationLock: wake lock
has already been released


D/GASH-worker( 1178): scheduler_select_notify: writing something to
control pipe


D/GASH-worker( 1178): scheduler_select_callback: select canceled by
request


D/GpsLocationProvider( 1178): Releasing wakelock


V/Hello ( 1970): btry unregist:314 jp.local.hello.MainService
$2@459eafe0


V/Hello ( 1970): Receiver not registered: jp.local.hello.MainService
$2@459eafe0 314


D/KeyguardViewMediator( 1178): pokeWakelock(5000)


D/KeyguardViewMediator( 1178): pokeWakelock(5000)


D/KeyguardViewMediator( 1178): pokeWakelock(5000)


I/ActivityManager( 1178): Start proc
com.sonyericsson.android.timescape for broadcast
com.sonyericsson.android.timescape/.Widget.TimeScapeWidgetProvider:
pid=4048 uid=10018 gids={3003, 1015}


I/dalvikvm( 4048): Debugger thread not active, ignoring DDM send
(t=0x41504e4d l=38)


I/dalvikvm( 4048): Debugger thread not active, ignoring DDM send
(t=0x41504e4d l=72)


W/TS-SPL ( 4048): Unsupported setting key: im-presence-icon-
visibility


I/CustomizationProvider( 1339): No configuration file: /system/etc/
customization/settings/com/sonyericsson/android/timescape/
custom_settings.xml


W/TS-SPL ( 4048): load customization settings: -1


D/dalvikvm( 1178): GC freed 47751 objects / 2091984 bytes in 211ms


I/ActivityManager( 1178): Process com.sonyericsson.android.timescape
(pid 4048) has died.


D/dalvikvm( 1290): GC freed 2077 objects / 160208 bytes in 62ms


D/dalvikvm( 1290): GC freed 1002 objects / 64448 bytes in 39ms


D/dalvikvm( 1290): GC freed 2791 objects / 214320 bytes in 47ms


D/dalvikvm( 1290): GC freed 1931 objects / 135088 bytes in 91ms


D/dalvikvm( 1970): GC freed 7502 objects / 368968 bytes in 52ms


V/Hello ( 1970): delete MainService:314


V/Hello ( 1970): delete MainService:313


V/Hello ( 1970): delete MainService:312


W/IInputConnectionWrapper( 1970): finishComposingText on inactive
InputConnection


I/wpa_supplicant( 1237): CTRL-EVENT-STATE-CHANGE id=-1 state=2


V/WifiMonitor( 1178): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=2]


V/WifiStateTracker( 1178): Changing supplicant state: INACTIVE ==>
SCANNING


D/NetworkStateTracker( 1178): setDetailed state, old =IDLE and new
state=SCANNING


D/ConnectivityService( 1178): Dropping ConnectivityChange for WIFI:
DISCONNECTED/SCANNING


I/wpa_supplicant( 1237): CTRL-EVENT-SCAN-RESULTS Ready


D/dalvikvm( 1290): GC freed 1034 objects / 82056 bytes in 362ms


I/wpa_supplicant( 1237): CTRL-EVENT-STATE-CHANGE id=-1 state=1


V/WifiMonitor( 1178): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=1]


V/WifiStateTracker( 1178): Changing supplicant state: SCANNING ==>
INACTIVE


D/NetworkStateTracker( 1178): setDetailed state, old =SCANNING and new
state=IDLE


D/ConnectivityService( 1178): Dropping ConnectivityChange for WIFI:
DISCONNECTED/IDLE


D/dalvikvm( 1366): GC freed 19311 objects / 873064 bytes in 41ms


I/ActivityManager( 1178): Process jp.local.hello (pid 1970) has died.


D/dalvikvm( 1366): GC freed 2103 objects / 105736 bytes in 57ms


D/dalvikvm( 1366): GC freed 27 objects / 992 bytes in 33ms


D/dalvikvm( 1366): GC freed 59 objects / 2144 bytes in 107ms


D/dalvikvm( 1366): GC freed 646 objects / 36312 bytes in 108ms


D/dalvikvm( 1366): GC freed 264 objects / 12856 bytes in 110ms


I/wpa_supplicant( 1237): CTRL-EVENT-STATE-CHANGE id=-1 state=2


V/WifiMonitor( 1178): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=2]


V/WifiStateTracker( 1178): Changing supplicant state: INACTIVE ==>
SCANNING


D/NetworkStateTracker( 1178): setDetailed state, old =IDLE and new
state=SCANNING


D/ConnectivityService( 1178): Dropping ConnectivityChange for WIFI:
DISCONNECTED/SCANNING


D/dalvikvm( 1366): GC freed 1829 objects / 82008 bytes in 35ms


D/dalvikvm( 1366): GC freed 294 objects / 15616 bytes in 34ms


I/ActivityManager( 1178): Starting activity: Intent
{ act=android.intent.action.MAIN
cat=[android.intent.category.LAUNCHER] flg=0x10200000
cmp=com.android.vending/.AssetBrowserActivity }


W/ResourceType( 1178): Skipping entry 0x7f040022 in package table 0
because it is not complex!


W/ResourceType( 1178): Skipping entry 0x7f040034 in package table 0
because it is not complex!


D/dalvikvm( 1434): GC freed 9167 objects / 569944 bytes in 56ms


D/ResourceType( 1434): calling getConfigurations


D/ResourceType( 1434): called getConfigurations size=315


D/asset ( 1434): locale 0: ''


D/asset ( 1434): locale 1: 'ca'

I/ActivityManager( 1178): Displayed activity
com.android.vending/.AssetBrowserActivity: 564 ms (total 564 ms)


I/wpa_supplicant( 1237): CTRL-EVENT-SCAN-RESULTS Ready


D/vending ( 1434): [15] BaseAction.run(): AuthFailureException:
com.android.vending.api.AuthFailureException


I/vending ( 1434): [1] 2.run(): Invalidating auth token.


I/wpa_supplicant( 1237): CTRL-EVENT-STATE-CHANGE id=-1 state=1


V/WifiMonitor( 1178): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=1]


V/WifiStateTracker( 1178): Changing supplicant state: SCANNING ==>
INACTIVE


D/NetworkStateTracker( 1178): setDetailed state, old =SCANNING and new
state=IDLE


D/ConnectivityService( 1178): Dropping ConnectivityChange for WIFI:
DISCONNECTED/IDLE


D/OpenSSLSessionImpl( 1325): Freeing OpenSSL session


D/dalvikvm( 1325): GC freed 10451 objects / 591928 bytes in 133ms


D/dalvikvm( 1434): GC freed 5648 objects / 546552 bytes in 158ms


D/vending ( 1434): [20] RadioHttpClient.isRadioActiveElseWait(): calls
going through connection type SUPL


D/ConnectivityService( 1178): startUsingNetworkFeature for net 0:
enableSUPL


D/ConnectivityService( 1178): reconnecting to special network


D/DataConnectionTracker( 1292): enableApnType(supl), isApnTypeActive =
true and state = CONNECTED


D/DataConnectionTracker( 1292): setEnabled(2, true) with old state =
false and enabledCount = 1


D/NetworkStateTracker( 1178): setDetailed state, old =DISCONNECTED and
new state=CONNECTING


D/MobileDataStateTracker( 1178): supl Received state= CONNECTED, old=
CONNECTING, reason= apnChanged, apnTypeList= supl


D/NetworkStateTracker( 1178): setDetailed state, old =CONNECTING and
new state=CONNECTED


D/ConnectivityService( 1178): ConnectivityChange for MOBILE_SUPL:
CONNECTED/CONNECTED


D/DataConnectionTracker( 1292): EVENT_APN_ENABLE_REQUEST 2, 1


D/DataConnectionTracker( 1292): dataEnabled = false, enabledCount =
1, isApnTypeActive = true


E/NetworkStateTracker( 1178): net.tcp.buffersize.hsdpa not found in
system properties. Using defaults


V/NetworkStateTracker( 1178): Setting TCP values:
[4096,87380,110208,4096,16384,110208] which comes from
[net.tcp.buffersize.default]


D/ConnectivityService( 1178): adding dns 220.159.212.200 for MOBILE


D/ConnectivityService( 1178): adding dns 220.159.212.201 for MOBILE


D/NetworkStateTracker( 1178): addPrivateDnsRoutes for Mobile data
state: CONNECTED(rmnet0) - mPrivateDnsRouteSet = false


D/NetworkStateTracker( 1178): adding 220.159.212.200 (-925589540)


D/NetworkStateTracker( 1178): adding 220.159.212.201 (-908812324)


D/GpsLocationProvider( 1178): updateNetworkState available info:
NetworkInfo: type: MOBILE_SUPL[HSDPA], state: CONNECTED/CONNECTED,
reason: apnChanged, extra: mpr2.bizho.net, roaming: false, failover:
false, isAvailable: true


D/GpsLocationProvider( 1178): NetworkThread wait for 10126485ms


V/AutoSyncService( 1721): onCreate()


I/MediaUploader( 1271): No need to wake up


I/OnlineReceiver( 1327): Receiver onConnectivity


D/OnlineReceiver( 1327): Broadcast: Network Up


I/OnlineService( 1327): OnlineService onCreate


D/ConnectivityService( 1178): ConnectivityChange for MOBILE_SUPL:
CONNECTED/CONNECTED


E/NetworkStateTracker( 1178): net.tcp.buffersize.hsdpa not found in
system properties. Using defaults


V/NetworkStateTracker( 1178): Setting TCP values:
[4096,87380,110208,4096,16384,110208] which comes from
[net.tcp.buffersize.default]


I/OnlineService( 1327): OnlineService onStart


D/vending ( 1434): [1] RadioNetworkWaiter.onReceive(): Network info:
NetworkInfo: type: MOBILE[HSDPA], state: CONNECTED/CONNECTED, reason:
pdpReset, extra: mpr2.bizho.net, roaming: false, failover: false,
isAvailable: true


D/Smack ( 1325): [XMPPConn] close connection, notifyClosed=false


D/ConnectivityService( 1178): adding dns 220.159.212.200 for MOBILE


D/ConnectivityService( 1178): adding dns 220.159.212.201 for MOBILE


D/NetworkStateTracker( 1178): addPrivateDnsRoutes for Mobile data
state: CONNECTED(rmnet0) - mPrivateDnsRouteSet = true


D/vending ( 1434): [1] RadioNetworkWaiter.onReceive(): Network info:
NetworkInfo: type: MOBILE_SUPL[HSDPA], state: CONNECTED/CONNECTED,
reason: apnChanged, extra: mpr2.bizho.net, roaming: false, failover:
false, isAvailable: true


D/vending ( 1434): [1] RadioNetworkWaiter.onReceive(): Network info:
NetworkInfo: type: MOBILE_SUPL[HSDPA], state: CONNECTED/CONNECTED,
reason: apnChanged, extra: mpr2.bizho.net, roaming: false, failover:
false, isAvailable: true


V/AutoSyncService( 1721): onStart(): action_auto_sync_event[3]


V/AutoSyncService( 1721): onStart(): action_auto_sync_event[3]


W/Smack/Packet( 1325): notify conn break (IOEx), close connection


V/AutoSyncService( 1721): onDestroy()


D/Smack ( 1325): [XMPPConn] close: socket already closed, bail


I/OnlineService( 1327): OnlineService onDestroy


D/GpsLocationProvider( 1178): updateNetworkState available info:
NetworkInfo: type: MOBILE_SUPL[HSDPA], state: CONNECTED/CONNECTED,
reason: apnChanged, extra: mpr2.bizho.net, roaming: false, failover:
false, isAvailable: true


D/GpsLocationProvider( 1178): NetworkThread wait for 10126032ms


I/GTalkService( 1325): [ServiceAutoStarter] --- start GTalk service
---


I/MediaUploader( 1271): No need to wake up


I/OnlineReceiver( 1327): Receiver onConnectivity


D/OnlineReceiver( 1327): Broadcast: Network Up


I/OnlineService( 1327): OnlineService onCreate


I/OnlineService( 1327): OnlineService onStart


D/dalvikvm( 1327): GC freed 3086 objects / 394504 bytes in 42ms


I/OnlineService( 1327): OnlineService onDestroy


I/GTalkService( 1325): [ServiceAutoStarter] --- start GTalk service
---


I/ActivityManager( 1178): Start proc jp.local.hello for broadcast
jp.local.hello/.MainAlarm: pid=4075 uid=10117 gids={3003, 1015}

松村勇輝

unread,
Mar 3, 2012, 10:49:18 PM3/3/12
to android-g...@googlegroups.com

松村と申します。

ログを拝見したところ、LowMemoeyKillerによりプロセスがkillされているようです。

裏で大量のアプリを起動している場合に再現率が上がらないでしょうか?
現象発生時の端末全体の空きメモリ量と、
非再現時の空きメモリ量を比べてみてください。

killされる閾値や、LowMemoryKillerに関しては
検索すればすぐに見つかると思います。

以上です。

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

河村潔広

unread,
Mar 4, 2012, 8:47:51 AM3/4/12
to android-g...@googlegroups.com
kyorohiro.キ印です。

LowMemoeyKillerによりプロセスがkillされてると、kill以前のデータは飛んでしまいます。

再起動後、Service#onCreate()といったタイミングで、復帰処理をしてあげれば良いと思います。

そんな感じです。

2012年3月4日12:49 松村勇輝 <defin...@gmail.com>:

河村潔広

unread,
Mar 4, 2012, 9:22:18 AM3/4/12
to android-g...@googlegroups.com
kyorohiroです。

>
> 再現性は低く、起きたり起きなかったりします。
>
作りかけのものですが、下記アプリを使用すればLowMemoeyKillerを
起こしやすくできるので紹介します。

https://github.com/kyorohiro/KyoroHelloAndroid
KyoroStress.apk

KyoroStressは、10MB-160MBまで Java Heapを占有することができます。

よろしければどうぞ。

2012年3月4日22:47 河村潔広 <kyor...@gmail.com>:

河村潔広

unread,
Mar 4, 2012, 9:30:16 AM3/4/12
to android-g...@googlegroups.com
kyorohiroです。

Processキルから再起動時の動作を確認したい場合の動作を
簡単に確認する方法がありますので、紹介いたします。

※端末によるかも知れませんが....

<例1>
1. SDカードにファイルを書き込む。
2. SDカードをアンマウントする。
→ SDカードにアクセスしているアプリがProcessキルされる。
 数秒後、再起動する。

<例2>
1. UIスレッド上で意図的に、RuntimeExceptionをスローする。
→ アプリがProcessキルされる。
 数秒後、再起動する。


そんな感じです。

2012年3月4日23:22 河村潔広 <kyor...@gmail.com>:

takeshi honda

unread,
Mar 5, 2012, 10:34:58 AM3/5/12
to 日本Androidの会
河村様

ありがとうございます。KyoroStressで再現できました。
これは便利ですね。

ところで、KyoroStressを使った際に、私のプログラムはすぐにLowMemoryKillerに殺されてしまいましたが、
別のアプリ(Battery mixというアプリ)は殺されませんでした。
LowMemoryKillerに殺されないための方法はあるのでしょうか?

On 3月4日, 午後11:22, 河村潔広 <kyoroh...@gmail.com> wrote:
> kyorohiroです。
>
>
>
> > 再現性は低く、起きたり起きなかったりします。
>
> 作りかけのものですが、下記アプリを使用すればLowMemoeyKillerを
> 起こしやすくできるので紹介します。
>
> https://github.com/kyorohiro/KyoroHelloAndroid
> KyoroStress.apk
>
> KyoroStressは、10MB-160MBまで Java Heapを占有することができます。
>
> よろしければどうぞ。
>
> 2012年3月4日22:47 河村潔広 <kyoroh...@gmail.com>:
>
>
>
> > kyorohiro.キ印です。
>
> > LowMemoeyKillerによりプロセスがkillされてると、kill以前のデータは飛んでしまいます。
>
> > 再起動後、Service#onCreate()といったタイミングで、復帰処理をしてあげれば良いと思います。
>
> > そんな感じです。
>
> > 2012年3月4日12:49 松村勇輝 <define1...@gmail.com>:
> >> 松村と申します。
>
> >> ログを拝見したところ、LowMemoeyKillerによりプロセスがkillされているようです。
>
> >> 裏で大量のアプリを起動している場合に再現率が上がらないでしょうか?
> >> 現象発生時の端末全体の空きメモリ量と、
> >> 非再現時の空きメモリ量を比べてみてください。
>
> >> killされる閾値や、LowMemoryKillerに関しては
> >> 検索すればすぐに見つかると思います。
>
> >> 以上です。
>
> >> 2012/03/04 12:02 "takeshihonda" <moech...@gmail.com>:
> ...
>
> もっと読む ≫- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

河村潔広

unread,
Mar 5, 2012, 11:24:23 AM3/5/12
to android-g...@googlegroups.com
kiyohiroです。社内向け。

> ありがとうございます。KyoroStressで再現できました。
> これは便利ですね。

作りかけです。
1人日くらいかけて完成させてマーケットにアップしたいけど、時間が作れてない..。
※ ..たぶん、作り直すことになると思う..。


> ところで、KyoroStressを使った際に、私のプログラムはすぐにLowMemoryKillerに殺されてしまいましたが、
> 別のアプリ(Battery mixというアプリ)は殺されませんでした。
> LowMemoryKillerに殺されないための方法はあるのでしょうか?

殺されにくい条件ならばあります。
..教科書とおりの回答しかできませんが、

http://blog.cnu.jp/2010/10/11/android-process-kill/
のとおりです。

Forgroundアプリであれば、簡単には死なない。
それだけです。

# Define the oom_adj values for the classes of processes that can be
# killed by the kernel. These are used in ActivityManagerService.
setprop ro.FOREGROUND_APP_ADJ 0
setprop ro.VISIBLE_APP_ADJ 1
setprop ro.SECONDARY_SERVER_ADJ 2
setprop ro.BACKUP_APP_ADJ 2
setprop ro.HOME_APP_ADJ 4
setprop ro.HIDDEN_APP_MIN_ADJ 7
setprop ro.CONTENT_PROVIDER_ADJ 14
setprop ro.EMPTY_APP_ADJ 15

# Define the memory thresholds at which the above process classes will
# be killed. These numbers are in pages (4k).
setprop ro.FOREGROUND_APP_MEM 1536
setprop ro.VISIBLE_APP_MEM 2048
setprop ro.SECONDARY_SERVER_MEM 4096
setprop ro.BACKUP_APP_MEM 4096
setprop ro.HOME_APP_MEM 4096
setprop ro.HIDDEN_APP_MEM 5120
setprop ro.CONTENT_PROVIDER_MEM 5632
setprop ro.EMPTY_APP_MEM 6144


そんな感じで、おそまつさまでした。


2012年3月6日0:34 takeshi honda <moec...@gmail.com>:

takeshi honda

unread,
Mar 6, 2012, 12:52:32 AM3/6/12
to 日本Androidの会
ご回答ありがとうございます。

素人なのでよくわかっていないのですが、
これはAndroid端末に入っているカーネルを変更しなければならない、ということなのでしょうか?
それとも、Androidアプリを作る際に、javaコードにおまじないのようなものを書けば済む話なのでしょうか?

私のAndroid端末環境でも、殺されやすいアプリと殺されにくいアプリがあるということは、
多分後者だと思うのですが、どのようなおまじないを書けば殺されずにすむのでしょうか?
その辺の事は頂いたURLには書いてなかったと思いますので…
私のアプリは、ActivityからAlarmを定期的に起動して、さらにBroadcastReceiver.onReceiveから
IntentServiceを起動して、
そこで処理を行うようなつくりなのですが、どこにおまじないを書いたらよいのか、何か情報をお持ちでしたら教えていただけないでしょうか?

よろしくお願いいたします。
> 2012年3月6日0:34 takeshi honda <moech...@gmail.com>:

松村勇輝

unread,
Mar 6, 2012, 9:03:45 AM3/6/12
to android-g...@googlegroups.com
松村です。

> それとも、Androidアプリを作る際に、javaコードにおまじないのようなものを書けば済む話なのでしょうか? 
アプリ(Activityやサービス)をLowMemoryKillerにkillされ辛くするテクニックはいくつかあります。
Service.setForegroundやNotificationへの登録等です。
中にはシステムの隙をついた方法もあり動作が保証されておらず、あまりおススメしません。

余談ですが、「killをできる限り回避する」という方法は最終手段として考えた方がよいです。
LowMemoryKillerはシステムが不安定になるのを回避するために重要な仕組みです。
killをできる限り回避した場合の悪影響(特にユーザや他アプリへの影響)を考慮した方がよいです。

LowMemoryKillerによりkillされる前提でアプリを設計・実装するのをおススメします。

>  多分後者だと思うのですが、どのようなおまじないを書けば殺されずにすむのでしょうか?  
サードパーティアプリを作成されているのであれば「killされないアプリは無い」と考えても差支えないでしょう。
フォアグラウンドにいるアプリやランチャーアプリもkillの対象です。
"killされなくするおまじない"はありません。

以上です。

2012年3月6日火曜日14時52分32秒 UTC+9 takeshi honda:
2012年3月6日火曜日14時52分32秒 UTC+9 takeshi honda:

河村潔広

unread,
Mar 6, 2012, 11:37:34 AM3/6/12
to android-g...@googlegroups.com
kyorohiroです。

Forgroundアプリとすれば、PFからKillされにくくなります。
なので、Forgroundアプリとなる方法について説明します。
※ この範囲でDiscussしてもよいですが、「常駐アプリを実現するスタンダードな方法は何か」という範囲まで
広げるのも趣しろいかなと感じてます。とはいっても、この場は議論ではなくて、回答が望まれてるのかな..。


-------------------------
[Page0]
Foregroundアプリとは何かといえば、最前面に表示されているActivity持つアプリの事です。
このプロセスを殺さないのは当然のことと思います。

で、ServiceもForgroundとすることができます。


-------------------------
[Page1]
下記を参照してください。
http://developer.android.com/reference/android/app/Service.html
startForeground (int id, Notification notification)


startForgroundを呼ぶと、そのCallしたServiceがForgrounfアプリになります。
このAPIは、Android2.xから追加されたもので、1.6では、setForground()というメソッドを使用していました。

JavaDocには、Refelectionを使用して、Androidバージョンに非依存でForgroundアプリを実現する方法がソースレベルで展開されています。
--------------------------------

[Page2]
kyorohiroがこのソースを実際に組み込んだクラスがあるので、下記ソースを参照してみるのもありです!!

https://github.com/kyorohiro/KyoroHelloAndroid/tree/master/KyoroCommon/src/info/kyorohiro/helloworld/android/base
※ そのまんまです。

チョット宣伝になりますが、KyoroLogcatとかは、そのまんま使ってます。

--------------------------------
[Page3]
startForground()とsetForground()の違いは何?
startForground()では、Notification表示が必須となりました。

→ ユーザーに隠れてForgroundアプリになることができなくなった。
→ Notificationの表示/非表示とProcessの生死が動機するようになった。

※ 例) たとえば、Javadocのコードでも、Notificationを表示しようとしている瞬間に、Notificationを非表示にしようとするとどうなるのか?
   想像てみてください。
※ 例) Processが死んでいるのに、Notifiocationが表示されていた場合に、ユーザーがどのような誤解を生むか想像てみてください。

--------------------------------
[Page4]
※注意点
最後に、先に紹介したコードは万能でないことをお伝えします。
 Androidのバグで一部適切に動作しません。
// http://code.google.com/p/android/issues/detail?id=20035

- startForground()してみ、Notificationか表示されない。

※ 国産端末はまあ良いとして、素のアンドロイドを乗っけているような端末では、顕著にこの不具合がでるようです。
  というわけで、Forgroundの解除のトリガーをNotification表示領域のタップ操作とかに依存するのはNGです。

---------------------------------


おわり

----------------------------------------------

2012年3月6日23:03 松村勇輝 <defin...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。

> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/bqPrNhaWXIcJ
> にアクセスしてください。

takeshi honda

unread,
Mar 8, 2012, 5:58:39 AM3/8/12
to 日本Androidの会
ありがとうございます。
殺されないために、startForegroundするだけの何もしないサービスを作ることにしました。
お陰様で解決しました。

On 3月7日, 午前1:37, 河村潔広 <kyoroh...@gmail.com> wrote:
> kyorohiroです。
>
> Forgroundアプリとすれば、PFからKillされにくくなります。
> なので、Forgroundアプリとなる方法について説明します。
> ※ この範囲でDiscussしてもよいですが、「常駐アプリを実現するスタンダードな方法は何か」という範囲まで
> 広げるのも趣しろいかなと感じてます。とはいっても、この場は議論ではなくて、回答が望まれてるのかな..。
>
> -------------------------
> [Page0]
> Foregroundアプリとは何かといえば、最前面に表示されているActivity持つアプリの事です。
> このプロセスを殺さないのは当然のことと思います。
>
> で、ServiceもForgroundとすることができます。
>
> -------------------------
> [Page1]
> 下記を参照してください。http://developer.android.com/reference/android/app/Service.html
> startForeground (int id, Notification notification)
>
> startForgroundを呼ぶと、そのCallしたServiceがForgrounfアプリになります。
> このAPIは、Android2.xから追加されたもので、1.6では、setForground()というメソッドを使用していました。
>
> JavaDocには、Refelectionを使用して、Androidバージョンに非依存でForgroundアプリを実現する方法がソースレベルで展開され-ています。
> --------------------------------
>
> [Page2]
> kyorohiroがこのソースを実際に組み込んだクラスがあるので、下記ソースを参照してみるのもありです!!
>
> https://github.com/kyorohiro/KyoroHelloAndroid/tree/master/KyoroCommo...
> ※ そのまんまです。
>
> チョット宣伝になりますが、KyoroLogcatとかは、そのまんま使ってます。
>
> --------------------------------
> [Page3]
> startForground()とsetForground()の違いは何?
> startForground()では、Notification表示が必須となりました。
>
> → ユーザーに隠れてForgroundアプリになることができなくなった。
> → Notificationの表示/非表示とProcessの生死が動機するようになった。
>
> ※ 例) たとえば、Javadocのコードでも、Notificationを表示しようとしている瞬間に、Notificationを非表示にしようとするとどうなるの-か?
>    想像てみてください。
> ※ 例) Processが死んでいるのに、Notifiocationが表示されていた場合に、ユーザーがどのような誤解を生むか想像てみてください。
>
> --------------------------------
> [Page4]
> ※注意点
> 最後に、先に紹介したコードは万能でないことをお伝えします。
>  Androidのバグで一部適切に動作しません。
> //http://code.google.com/p/android/issues/detail?id=20035
>
> - startForground()してみ、Notificationか表示されない。
>
> ※ 国産端末はまあ良いとして、素のアンドロイドを乗っけているような端末では、顕著にこの不具合がでるようです。
>   というわけで、Forgroundの解除のトリガーをNotification表示領域のタップ操作とかに依存するのはNGです。
>
> ---------------------------------
>
> おわり
>
> ----------------------------------------------
>
> 2012年3月6日23:03 松村勇輝 <define1...@gmail.com>:
> >> > 2012年3月6日0:34takeshihonda<moech...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages