Android LMK( Low Memory Killer)に殺されたw

Androidアプリを作っていて、端末によって、バッググラウンドの処理が動いたり動かなかったりしたので、調べてみたらどうやらLMKという空きメモリが少なくなるとプロセスを殺すものがあるようだったので、メモ!

下記のようなログがそいつです!

Low Memory:No more background processes.

Android特有のものらしい、Killされる基準など下記サイトが参考なりました。

http://techbooster.jpn.org/andriod/application/1517/

http://d.hatena.ne.jp/hyoromo/20100509/1273399359

http://blog.cnu.jp/2010/10/11/android-process-kill/

http://d.hatena.ne.jp/misetu/20110108/1294490981

特にonPause等で裏側にまわるアプリなどバッググラウンド処理は、
消される可能性が高いようです。

adbを使って、androidのエミュレータ内のsqlite3やプリファレンスをチェックする

アンドロイド開発で、sqliteのデータや、
プリファレンスの中身を見たい時のチェック方法メモ。

まずadbが使える状況で、

$ adb devices

で、利用できるデバイス一覧が表示されます。

$ adb devices
List of devices attached 
37c70c34320b3d7 device

利用したいデバイスを下記コマンドで指定し、shell。

$ adb -s emulator-5554 shell

するとエミュレータ内で色々コマンドが実行できるようになる。

#ls
#pwd
#cd
#cat
・・・等々

本題のsqlite3やプリファレンスのデータを見るにはまず、そのファイルの場所にいきます。

◆プリファレンスの場所は下記、

#cat /data/data/対象のアプリのパッケージ名/shared_prefs/プリファレンス名.xml

実はxml形式だったのね。

◆sqlite3のデータの場所は下記、

#sqlite3 /data/data/対象のアプリのパッケージ名/databases/データベース名.db 
あとは好きなようにsqlite3のコマンドで、.tableしたりselectしたりできます。

 

 

Android UIスレッド操作まとめも

Androidアプリに埋め込む配布用のSDKを作っていて、メインアプリになるべく影響ない作りにしたいと思って開発しており、ネックになった部分を整理したいのでまとめも!
(javaはじめたばっかりなので、なんでもご指摘くださいm(_ _;)m)

上記の通り、メインアプリに影響をなるべくなくすために何をしたらいいか考えたみた結果、
SDKの処理は非同期でやることにした。 (jarファイルで配布する予定)
今回はUIの操作も必要なので、方法として2点あるようだ・・・(かな?

HandlerThreadを扱う方法とAsyncTaskを使う方法があるようで。
AndroidではUIの処理はシングルスレッドで、別タスクから処理は、そのシングルスレッドにジョブ登録するように利用する必要があるとの事。
AsyncTaskを使う場合は、メインのシングルスレッドにジョブを投げるよう意識する必要はないみたいですが。

 

■HandlerでUIスレッド(シングルスレッド)にジョブをpostするパターン

下記記事を参考にさせていただきました!ありがとうございます!
http://pentan.info/android/app/handler.html
http://www.adamrocker.com/blog/261/what-is-the-handler-in-android.html

UIスレッド操作はメインのスレッド以外から直接操作はできないので、
Handlerを使って、メインスレッドにタスクとしてpostしてあげる。
というのが必要との事。

Handler h= new Handler();

h.post(new Runnable() {
  @Override
  public void run() {
    textView.setText("helloworld!"); //UI操作OK!
  }
});

また、操作方法にはpostDelayedなどを使って一定時間ごとの処理も可能。

 

■AsyncTaskを使うパターン

参考にさせていただいたサイト!ありがとうございます!
http://android.keicode.com/basics/async-asynctask.php
http://labs.techfirm.co.jp/android/cho/1079
http://wikiwiki.jp/android/?AsyncTask%A4%C7%A5%D0%A5%C3%A5%AF%A5%B0%A5%E9%A5%A6%A5%F3%A5%C9%BD%E8%CD%FD%A4%F2%B9%D4%A4%A6

 

new MyAsyncAppTask().execute(api_key);
class MyAsyncTask extends AsyncTask<String, Integer, String[]>{ //
 @Override
 protected void onPreExecute() { 
 //準備処理を書く
 }
@Override
 protected void onProgressUpdate(Integer... values) {
 //進捗状況
 }
@Override
 protected void onCancelled() {
 //キャンセル
 }
@Override
protected String[] doInBackground(String... api_key) {
 //処理を書く※注意ここではUI処理はしない
 return strArr;
 }
@Override
 protected void onPostExecute(String[] str) {
 //処理完了時実行、doInBackgroundの戻り値など使って処理もできる。(UI処理も)
 }
}

 extends AsyncTask<型, 型, 型>
1つ目の型 = excute()の引数の型
2つ目の型 =  onProgressUpdateの引数の型
3つ目の型 = doInBackgroundの引数の型

・onPostExecuteの引数には「…」はいれない。

せっかく調べたので、メモ。

android-sdk マニフェストで、SurfaceViewの画面サイズが小さくなるのを防ぐ

アンドロイドのSurfaceViewを使っていて、端末によって画面サイズが小さくなってしまっていたので、色々調べてみた。

最初は完全にjavaコードのほうを疑っていて、

setFixedSize(getWidth(),getHeight());

など色々試してみたが、実は簡単に解決できた。
マニフェストで下記のandroid:anyDensity をfalseにして解決。

<supports-screens
 android:anyDensity="false"
 android:largeScreens="true"
 android:normalScreens="true"
 android:smallScreens="true" />

android:anyDensityにて解像度や密度を調整できるようです。
また、SdkVersionのバージョンによってデフォルトの設定など異なるようなのです。

下記サイト参考にさせていただきましたありがとうございます!

http://wavetalker.blog134.fc2.com/blog-entry-52.htmlhttp://d.hatena.ne.jp/Kazzz/20101127/p1

admob androidアプリに導入時のメモ(version4.3.1に妥協

結構はまったので、メモ。
admobは日本語ドキュメントがないので、結構はまりました。
特に、admob SDKバージョン4.3.1ではまってしまったのですが、admobの広告表示領域に、下記のようなエラーが表示されて解決できませんでした。。

"You must have AdActivity declared in AndroidManifest.xml with configChanges." 

下記、googleのドキュメントを何度読んでもエラーの原因がわからず、、
http://code.google.com/intl/ja/mobile/ads/docs/android/fundamentals.html

ネット上でも、同様な記事がたくさんありましたが探したものすべてを試してみましたが、結局解決せず、さすがに妥協してバージョン4.3.1ではなく、4.0.4を入れるとあっさり動きました。。(汗
version4.0.4は上記ドキュメントのサンプルより利用しました。

そもそも、上記ドキュメントのサンプルもSDKのバージョンが4.0.4なので本当に4.3.1が動くのか検証もできませんでした。
せめて最新VerのSDKサンプルがあれば納得がいくのですが。

Android版のSDK4.3.1で、コード(XMLに記述しない方法)で書いてうまくいった方是非ご教授いただけますと幸いです!(汗汗

 

使えるandroidのキーボード(IME)アプリ『GO キーボード』が非常に使える

 

最近やっとスマートホンのXperia acroを手に入れ色々とandroidアプリを触っていて、
これは使えるとおもったIMEアプリ、つまり入力する時に使うキーボードのアプリで大分気にいったのを紹介します!

いくつか入れてためしてみたのですが、無料で一番使いやすかったので紹介。

その名も『Go キーボード』 というアプリで、
箇条書きでよい点をあげるとこんな感じ。

  1. 多言語対応
  2. カスタマイズが豊富
  3. 音声入力
  4. 入力方式をすばやく変えられる(十字キー入力モードや、携帯の入力方式、パソコンの入力方式など、言語も選択したものをすばやく変更できる)
  5. ボタン長おしなどで、色々と特殊文字の入力もすばやくできる
  6. テーマなど、豊富なプラグイン

『GO キーボード』

 

ただ身の回りで動かない端末が結構あるようなので、
そこがクリアできれば無料で最強かと思われます。。w

ちなみに自分が利用している端末はXperia acroのAU版です。

 

AndroidアプリのHTTP通信時のパーミッション設定

アンドロイドアプリでgooglemapなどAPIを利用して、他への通信をする場合は、
あらかじめ、AndroidManifest.xmlに下記のように通信機能のパーミッションを追加する必要がある。

[xml]

<uses-permission android:name="android.permission.INTERNET">
</uses-permission>


[/xml]