【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を送る!という癖をつけておきたいものです。
ではでは今日はこの辺で。
コメントをどうぞ