スポンサー広告 - スポンサーサイト

--/--/-- (--) --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Android】壁ちぇん。 - バージョン 1.0.1

2011/05/21 (土) 14:58

さっそくバージョンアップ。

■変更点
1.機能を有効にして自動起動をOFFにしている状態でOSを再起動した際に、設定画面では機能が有効になっているのにタイマー(AlarmManager)が作動しない不具合の修正。
2.広告の表示で時間がかかりすぎてタイムアウトしてしまう場合があったので、広告表示の処理をスレッド化。
3.アプリケーションのバージョンアップ時に、タイマー(AlarmManager)を再設定する処理を追加。

■詳細
1については、単純な場合分けの考慮漏れです。がっくし。
OS起動時に自動起動が無効な場合は、有効/無効フラグをOFFにする処理を追加しました。

2については、AdMakerの指定の実装方法とは少々異なる実装をしたのだけれども、たまたま自分で確認したときに事象が発生したので対応しました。
設定画面は「PreferenceActivity」で行っているので、画面の下側に常に表示するにはどうしたらよいか色々調査した結果、動的に上から「LinearLayout」を被せてしまうことに。
この方法だと「PreferenceActivity」がスクロールしきったときに広告の部分が重なってしまうので、「PreferenceActivity」の最後尾に広告と同じ高さの領域をダミーで仕込んでおく。
こんな感じ

public class KabechenPreference extends PreferenceActivity {

/**
* スレッド用のハンドラ
*/
private Handler handler = new Handler();

/**
* 広告オブジェクト
*/
private libAdMaker adView = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preference);

// 広告
adView = new libAdMaker(this);
adView.setActivity(this);
adView.siteId = "siteId"; // 設定値は契約毎に異なる
adView.zoneId = "zoneId"; // 設定値は契約毎に異なる
adView.setUrl("Url"); // 設定値は契約毎に異なる

// 表示に時間がかかることがあるのでスレッド化
new Thread(new Runnable() {
public void run() {
// レイアウトに変更を加えるので Handler を使用
handler.post(new Runnable() {
public void run() {
adView.start();
adView.setVisibility(android.view.View.VISIBLE);

LayoutParams adLayoutParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
adView.setLayoutParams(adLayoutParams);
LinearLayout linearlayout = new LinearLayout(getApplicationContext());

linearlayout.addView(adView);
linearlayout.setGravity(Gravity.BOTTOM);

LayoutParams layoutParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
addContentView(linearlayout, layoutParams);
}
});
}
}).start();

}
}

addPreferencesFromResource しているXMLの PreferenceScreen タグの中の最後に以下を追加。
<!-- 広告 -->
<Preference
android:selectable="false"
android:layout="@layout/dummy"
/>

android:layout に設定しているレイアウトは以下。
<?xml version="1.0" encoding="utf-8"?>
<View
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dummyid"
android:layout_width="fill_parent"
android:layout_height="48dp"
/>


3につては、バージョンアップの必要性が出てきたので影響を調査していたところ、壁紙変更のタイミング設定は AlarmManager で実装してるのだけれども、なんとアプリバージョンアップ時に設定が消えてしまうのだとか。
バージョンアップ後に、設定画面で「有効/無効」を再設定してもらえればいいのだけども、わずらわしいので自動で対応したい。
なんとかバージョンアップのタイミングを取得しようと調査したところ、「android.intent.action.PACKAGE_REPLACED」というブロードキャストが投げられるとのこと。
んが、指定のアプリのバージョンアップのみの通知を受け取ることがかなわなかった。
調査の過程でマニフェストのインテントフィルタに
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:scheme="package" android:path="tak.tools.kabechen" />
</intent-filter>

とか書けばフィルタリングが可能とあったが、エミュレータ、実機(IS05)共に絞り込みはできず、
結局は BroadcastReceiver に以下の記述を施した。

public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(Intent.ACTION_PACKAGE_REPLACED.equals(action)){
String uri = intent.getData().toString();
if("package:tak.tools.kabechen".equals(uri)){
// 機能が有効ならアラームを再設定する処理を実装
}
}
}

一々通知を精査するのもどうかと思うが、当面はこれで。他に良い方法が見つかれば変更するかもしれない。

長くなってしまったけれども、今回の変更の詳細は以上です。
関連記事

コメントの投稿

非公開コメント

検索フォーム
RSSリンクの表示
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
月別アーカイブ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。