2012年2月23日木曜日

android4.0.3 update

いつのまにかandroidの最新版が4.0.3にupdateされていました。
というわけでさっそくupdateしました。前提条件は、すでに4.0が導入されていることです。
以下作業手順です。

android4.0.3 update

    eclipse 起動(Open Eclipse)
        ↓
    ウィンドウ選択 > Android SDK Manager (Select Window > Android SDK and AVD Manager.)
        ↓
    チェックボックスの内容を確認
        ↓
    install XX packages

以上の手順を踏むと、updateが開始されます。私は5分くらいかかりました。
全て終了したら、eclipseを再起動します。

4.0.3のエミュレーターを起動すると、上記のような画面になります。
見た目に大きな変更はなく、バグの修正が中心に行われているようです。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年2月21日火曜日

Androidアプリ「HTML5」version1.1.0公開

Androidアプリ「HTML5」のversion1.1.0を公開しました。 リファレンスを利用できるようにしました。 Lv3のjavaScriptの問題を追加しました。

図1:リファレンス

図2:Lv3 javaScript 問題

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年2月14日火曜日

life cycle of fragment

さて、すっかりとandroid開発になくてはならなくなったfragmentですが、どうも挙動や メモリ管理に???なことが多々起こるので調査することにしました。
調査はandroid-support-v4.jarで行いました。違うversionを利用しているかたは注意してください。

さて、ListFragmentを使って挙動を確認します。
FragmentActivityを継承したクラスでListFragmentを継承したクラスを実体化します。

sample1 : FragmentActivity screen is displayed!!

    onCreateView
        ↓
    onActivityCreated
        ↓
    onStart
        ↓
    onResume

上記のような場合は、onCreateViewでviewを作り、onActivityCreatedでデータを設定するのが典型的なパターンでしょう。
さて、次に表示されているFragmentActivity画面で、デバイスの戻るボタンを押します。

sample2 : Device back is pushed!!

    onPause
        ↓
    onStop
        ↓
    onDestroyView
        ↓
    onDestroy
        ↓
    onDetach

色々と呼び出されましたね。
しかし、これではよくわかりません。なので、FragmentActivity画面で、ホームボタンを押します。

sample3 : Home button is pushed!!

    (onSaveInstanceState)
        ↓
    onPause
        ↓
    onStop

画面がユーザーから見えなくなると上記の二つのメソッドが呼び出されるわけです。
さて、再びアプリを立ち上げます。

sample4 : Application is relaunched

    onStart
        ↓
    onResume

activityと同じ挙動ですね。理解しやすいです。
縦横画面対応かつ、ユーザーの入力項目がある場合は、ここでonSaveInstanceStateで保存したデータの詰め替えをおこなうと良いでしょう。通常は無視で問題ないです。

ListFragmentは列表示に使うので、他のFragmentActivity画面に遷移します。

sample5 : Next screen is called!!

    (onSaveInstanceState)
        ↓
    onPause
        ↓
    次画面の処理
        ↓
    onStop

onPauseとonStopの間に次の画面の処理が入るのに注意してください。

最後に前の画面に戻ります。

sample6 : Prev screen is backed!!

    onStart
        ↓
    onResume

上記の流れがわかれば、挙動でほとんど困ることはないでしょう。
ガーベッジコレクションのみに依存するとろくなことにならないので、コードが煩雑にならない程度に、適切にオブジェクトを破棄しましょう。
あくまで「電話」だという認識を忘れないようしましょう。
メモリは大切にね。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年2月13日月曜日

Androidアプリ「記憶の王様」version1.3.0公開

Androidアプリ「記憶の王様」のversion1.3.0を公開しました。
「レポート」のページを追加しました。
中国語に対応しました。

図1:履歴

図2:記憶時間レポート結果

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年2月12日日曜日

androidのWebViewからiphonのUIWebViewへの移植 その3

前回はandroidのwebViewを利用してHTMLをロードする方法を学びました。
今回はiphoneのUIWebViewを使った画面表示のソースを以下に示します。

sample1. UIWebView source code objective-C interface(ios4)

#import <Foundation/Foundation.h>

//  WEBHTML アプリについて
static NSInteger const ABOUT_APP = 1;
//  WEBHTML アプリについて タイトル
static NSString *const ABOUT_APP_ITEM_NAME = @"アプリについて";

@interface WebViewController : UIViewController<UIWebViewDelegate> {
 @private
  NSInteger webDisp_;
  UIWebView *webView_;
  NSString *pathForResource_;
}

@property(nonatomic, assign)NSInteger webDisp;
@property(nonatomic, retain)UIWebView *webView;
@property(nonatomic, retain)NSString *pathForResource;

- (void)cancel;

@end

sample2. UIWebView source code objective-C implementation(ios4)

#import WebViewController.h"


@implementation WebViewController
@synthesize webDisp = webDisp_;
@synthesize webView = webView_;
@synthesize pathForResource = pathForResource_;

- (void)cancel {
    NSLog(@"%s", __func__);
    [self dismissModalViewControllerAnimated:YES];
}

- (void)viewDidLoad {
    NSLog(@"%s", __func__);

    if (ABOUT_APP == webDisp_) {
        self.title = ABOUT_APP_ITEM_NAME;
        self.pathForResource = @"about_app";
    } 

    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancel)];

    self.navigationItem.backBarButtonItem = leftButton;
    [leftButton release];

    self.webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
    self.webView.scalesPageToFit = YES;

    self.webView.delegate = self;
    [self.view addSubview:self.webView];

    NSString *path = [[NSBundle mainBundle] pathForResource:pathForResource_ ofType:@"html"];
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]]];
 
    [super viewDidLoad];
}

- (void)webViewDidStartLoad:(UIWebView*)webView {
    NSLog(@"%s", __func__);
    // ページ読込開始時にインジケータをくるくるさせる
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

- (void)webViewDidFinishLoad:(UIWebView*)webView {
    NSLog(@"%s", __func__);
    // ページ読込完了時にインジケータを非表示にする
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    NSLog(@"%s", __func__);
    // 読み込みに失敗した場合は前のページに戻る
    [self dismissModalViewControllerAnimated:YES];
}

- (void)viewDidUnload {
    webView_.delegate = nil;
    [webView_ release], webView_ = nil;
    [pathForResource_ release], pathForResource_ = nil;
    [super viewDidUnload];
}

- (void)dealloc {
    webView_.delegate = nil;
    [webView_ release], webView_ = nil;
    [pathForResource_ release], pathForResource_ = nil;
    [super dealloc];
}

@end

大切なことは、webView_をreleaseする時は、delegateにnilをセットする必要があることです。
htmlはResourcesフォルダ配下に設定します。ここでは、about_app.htmlというHTMLファイルを設定しています。
サーバー側において呼び出す場合は、通信エラー処理も追加しましょう。エラーメッセージはalertで表示するのがiphoneコーディングの流儀です。

このソースをコンパイルして実行すると、以下のような画面が表示されます。

図1.アプリについて画面(iphone)

ナビゲーションバーの下にロードしたHTMLが表示されています。

以上で移植作業は完了になります。
一度慣れてしまえば、HTML共通化コーディングはアプリ作成作業をとても楽にします。
開発者のみなさんが、楽しい開発ライフを送って定時で帰宅できることを祈ってます。
でわ。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年2月8日水曜日

The real object has been deleted

ログにThe real object has been deletedというエラーが発生していたので調査しました。
このエラーが発生してもアプリケーションが落ちるわけではないので、放置でも問題はないのですが、気持ち悪いので調べました。

調査の結果、利用したWebViewをonDestroyメソッドで削除しないで、他の画面でWebViewを使うと発生することがわかりました。
なので、対処方法は以下のようになります。

source code fix "The real object has been deleted"

    @Override
    public void onDestroy() {
        webView.destroy(); 
        super.onDestroy();
    }

上記のようにすると、エラーが発生しなくなります。
ゴミはきちんと処分しましょう。ということのようです。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

androidのWebViewからiphonのUIWebViewへの移植 その2

共通化の重要性は前回で指摘しました。ではandroidのwebViewを使った画面表示のソースを以下に示します。

sample1. WebView source code java(minSdkVersion android2.1)

    private boolean useLogo = false;
    private boolean showHomeUp = false;

    WebView webView;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.web_view_layout);
        
        final ActionBar ab = getSupportActionBar();

        // set defaults for logo & home up
        ab.setDisplayHomeAsUpEnabled(showHomeUp);
        ab.setDisplayUseLogoEnabled(useLogo);

        this.webView = (WebView) findViewById(R.id.webview);
        String html = getIntent().getStringExtra(Constants.PARAM_NAME_HTML_TYPE);
        if (Constants.PARAM_NAME_HTML_TYPE_ABOUT.equals(html)) {
            this.webView.loadUrl("file:///android_asset/html/about.html");
        }
    }

    @Override
    public void onDestroy() {
        webView.destroy(); 
        super.onDestroy();
    }

sample2. WebView source code xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:background="@drawable/common_bg" >

    <WebView  
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" 
        android:background="#00000000" />
        
</RelativeLayout>

sample1のソースコードでは、webView変数にHTMLを設定しています。
このアプリでは、HTMLを内部ファイルとしてassets/html/配下に配置してあります。
サーバー側において呼び出す場合は、通信エラー処理も追加しましょう。
ただ、スマートフォンの通信は負荷が大きいので、なるべく内部ファイルとして配置したほうがいいと思います。
クラスはactivity、fragmentのどちらでも構いません。アプリの設計次第です。
このアプリでは、FragmentActivityを継承したクラスで利用しています。

このソースをコンパイルして実行すると、以下のような画面が表示されます。

図1.実行結果画面

アクションバーの下にHTMLが表示されています。
次回は、このコードをiphoneでも実装できるように移植していきます。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年2月7日火曜日

Androidアプリ「記憶の王様」version1.2.0公開

Androidアプリ「記憶の王様」のversion1.2.0を公開しました。
「記憶情報」「記憶日付情報」のページを追加しました。

記憶時間の随時更新と日付ごとの記憶時間確認ができるようになりました。
記憶時間の目安、確認として利用できます。

図1:記憶情報画面

図2:記憶日付情報画面

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年2月5日日曜日

androidのWebViewからiphonのUIWebViewへの移植 その1

アプリ開発を行う場合に、iphoneアプリとandroidアプリの両方を作成しないといけない場合があると思います。
両方のアプリを開発する場合の最大の問題はプログラミング言語です。
androidはjava、iphoneはobjetive-Cという別々の言語で開発をしなければなりません。

プログラミング能力に長けたエンジニアなら使用するプログラム言語の違いはそれほど問題ではないと思いますが、開発効率を考えると共通化できる部分は共通化しておきたいところです。

というわけで、ここではandroidのWebViewを使って画面の一部をHTMLで作成し、iphoneのUIWebViewに移植することをやっていきたいと思います。
サンプルには私の開発したアプリ「記憶の王様」の一部を利用します。

android版「記憶の王様」アプリでは、【その他】画面から遷移できる【アプリについて】【アプリ使用例】【利用規約】【ライセンス契約】の内容をWebViewを使ったHTMLで表示しています。

図1.その他画面(android)

図2.アプリについて画面(android)


これをiphone版「記憶の王様」アプリでは、UIWebViewを使って以下のように移植します。

図3.その他画面(iphone)

図4.アプリについて画面(iphone)

【アプリについて】画面の内容はandroidと同じようにHTMLで表示しています。
このようにHTMLを使い回すことで、保守性が高い、エンジニアの負担を軽減してくれるアプリ開発をおこなうことが出来ます。
ただし、複雑な処理をHTMLで記述するのは処理速度上あまりお薦めできません。 一方で、シンプルな箇所はなるべくHTMLにしたいところです。
さて、それでは移植作業の説明をしていこうと思います。
少々長い話になると思いますが、よろしくお願いします。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年2月2日木曜日

世の中の変化を考える

ソーシャルメディアの普及で世の中は大きく変化してきています。
その中でも大きな変化の一つが、力あるものが、世の中の表舞台に出てくるスピードが圧倒的に早くなったことでしょう。
これは、どの世界でも共通にみられる傾向です。
最近の例だと、youtubeでadeleのRolling in the deepをコピーした驚くべき歌唱力の少女があっというまに世界中で有名になりました。

しかし、一方で、これまでそこそこの力でなんとか表舞台でやっていた人たちはどんどん消えていってます。
誰でもネットを通して世界中の情報を取得できることで、みんなが求めるハードルが自然と高くなっているのです。
つまり本物しか残れない世界に確実になってきているのです。

さて、こういう世界が到来したことで考えなくてはいけないのは、我々普通の人たちです。
会社という箱も今後はどんどん消えていくでしょうし、仕事もどんどんグローバル化が進むでしょう。経済格差もますます広がると思います。この流れは絶対に止まりません。仕事のオートメーション化も今後10年で飛躍的に高まるはずです。

そういった要因を考えると、私達はライフスタイルそのものを変える時期に来ているように思えます。
私達は「自分に合った生活」を模索しないといけないのでしょう。
今までは、国の用意したレール、つまりは幼稚園、小学校、中学校、高校、大学、社会人という軌道にのっていけばそれなりに満足のいく生活が送れました。
しかし、グローバル化したことで良くも悪くもルールが変わってしまいました。
国のルール、世界のルール、自分のルールの三つをバランス良く消化しないと満足のいく生活がおくれなくなってきてます。

今年は各国のトップに変化が起こる年なので、もっと変化がおきそうな気がします。

自分のコントロールできることとできないことの判断がより求められることになりそうです。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

2012年2月1日水曜日

iphoneシュミレータでスクリーンショットを撮影する

アプリ開発では、画面をキャプチャすることが多々あると思います。
なので、iphoneシュミレータを使った画面をキャプチャする手順を以下に記します。

  • iphoneシュミレータを起動し、キャプチャしたい画面にする
  • command + control + c で画面をキャプチャする
  • プレビューアプリを起動し、クリップボードから新規作成を選択する

以上の手順で画面をキャプチャできます。


*上記のサンプル画像は、iphone版「記憶の王様」アプリの開発中の画面です

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加
Related Posts Plugin for WordPress, Blogger...