お使いのブラウザは、バージョンが古すぎます。

このサイトは、Internet Explore8・Internet Explore9には対応しておりません。
恐れ入りますが、お使いのブラウザをバージョンアップしていただきますよう宜しくお願いいたします。

【Android Tips】次のActivityにサイズの大きいBitmapを渡す方法

こんにちわ、pencoです。 
今回はActivity間でのBitmapの受け渡しについて考えていきたいと思います。

 
まず思いつく方法としては、intentを使用して渡す方法ですね。
例えばこのように

Intent intent = new Intent(this, NextActivity.class);  
intent.putExtra("img", bitmap);  
startActivity(intent); 

ところが、この方法ではサイズの大きいBitmapを渡そうとするとエラーが発生します。そこで、Applicationクラスを経由させてBitmapを渡すことにします。
 

Applicationクラスを使用する

 
Applicationクラスは、アプリの起動時に自動的にインスタンス化されるクラスです。マニフェストのapplicationタグでその名前を指定することにより、独自の実装を提供することができます。
 
まずは、Applicationを継承したクラスを作ります。

public class MyApplication extends Application{
    private final String TAG = "APPLICATION";

    @Override
    public void onCreate() {
        //Application作成時
        Log.v(TAG,"--- onCreate() in ---");
    }
 
    @Override
    public void onTerminate() {
        //Application終了時
        Log.v(TAG,"--- onTerminate() in ---");
    }
}

 
次に、AndroidManifest.xml でapplicationの名前を指定します。

<application
    android:name="jp.co.nihonvtr.application.MyApplication" 
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">

applicationタグに「android:name」属性を追加し、先程作ったApplicationクラスをパッケージ名から指定します。
 

Bitmapを渡すメソッドを作成

 
これでApplicationクラスを使用出来るようになったので、Bitmapを渡す為のメソッドを作ります。

public class MyApplication extends Application{
    private final String TAG = "APPLICATION";
    private Bitmap obj;
	
    @Override
    public void onCreate() {
        //Application作成時
        Log.v(TAG,"--- onCreate() in ---");
    }
 
    @Override
    public void onTerminate() {
        //Application終了時
        Log.v(TAG,"--- onTerminate() in ---");
    }
 
    public void setObj(Bitmap bmp){
        obj = bmp;
    }
 
    public Bitmap getObj(){
        return obj;
    }

    public void clearObj(){
    	obj = null;
    }
}

 
Applicationクラスにデータをセットする事で、アプリ全体でそのデータを共有できるようになります。先に「Applicationクラスを経由し~」なんて書き方をしましたが、アプリ全体で共有できるクラスにデータを一旦預けて、再度取得する、ということですね。
 

Bitmapの受け渡し処理

 
では、実際にBitmapを受け渡す処理について書いていきます。
渡す時は、ActivityにてApplicationクラスを取得し、Bitmapをセットします。
 
SampleActivity.java

MyApplication app = (MyApplication)this.getApplication();
app.setObj(bitmap);
Intent intent = new Intent(this, NextActivity.class);   
startActivity(intent); 

 
受け取る時は、受け取り先のActivityでApplicationクラスを取得し、Bitmapを取得します。
 
NextActivity.java

MyApplication app;
app = (MyApplication)this.getApplication();
Bitmap image = app.getObj();

 
これで、Activity間でサイズの大きいBitmapの受け渡しが出来ました。

メモリエラーの回避

 
最後に、このままだとApplicationクラスがBitmapを保持したままになってしまうので、受け取り先のActivityを終了する時に、Bitmapをクリアする処理を追加しておきます。
 
NextActivity.java

@Override
protected void onDestroy() {
    super.onDestroy();
    app.clearObj();
}

 
これでGCがかかった時にメモリが解放されるはず…です。
メモリのエラーはほんとウンザリしますからね…
いらなくなったらすぐnullを送る!という癖をつけておきたいものです。
 
ではでは今日はこの辺で。

コメントをどうぞ

メールアドレスは公開されません。* が付いている欄は必須項目です。


お気軽にお問い合わせください。

日本VTR実験室では、お仕事のご依頼、ブログ・コラムのご感想などを受け付けております。
アプリ開発・コンテンツ制作でお困りでしたら、お気軽にご相談ください。
ご連絡お待ちしております。

お問い合わせはこちらから

03-3541-1230

info@nvtrlab.jp

電話受付対応時間:平日AM9:30〜PM6:00