Tokyo GTUG Bootcamp2010

2,960 views

Published on

how to pass data betweein activities. This slide was written in Japanese.

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,960
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
54
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Tokyo GTUG Bootcamp2010

  1. 1. Tokyo GTUG主催 Bootcamp 2010 Android: Activity間の情報の受け渡し方 江川 崇(@t_egg/ egg)
  2. 2. 自己紹介 • 江川 崇(EGAWA Takashi) • プログラマー • egg / @t_egg • Android Developers’ Club(デ部) • Android プログラミング入門 • IMoNiなど
  3. 3. 今日お話ししたいこと 「Activity間の情報の受け渡し方」
  4. 4. 今日お話ししたいこと 「Activity間の情報の受け渡し方」 たくさんありますが、今回はその中でも、なるべく簡 単にできる方法をご紹介します。 私も知らないことがたくさんありますし、皆さんと一 緒に理解を深めていきたいので、随時質問して下さ い。
  5. 5. startActivity public class A extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a); } public void click(View v) { Intent i = new Intent(this, B.class); startActivity(i); } }
  6. 6. startActivity layout/a.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andr oid" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/button" android:onClick="click" /> </LinearLayout>
  7. 7. Can I ask? •ボタンが押されたときに、clickメソッ ドが呼ばれます。紐付けはどこで? •startActivityが呼ばれると何が起き ますか?
  8. 8. Can I ask? •ボタンが押されたときに、clickメソッ ドが呼ばれます。紐付けはどこで? android:onClick •startActivityが呼ばれると何が起き ますか? 指定されたActivityが最前面に来る ※ Activityを選択するDialogが出るか、Activityが 見つからずにエラーになるケースもある
  9. 9. startActivity こう変えたらどうなる? public class A extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a); } public void click(View v) { Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/")); startActivity(i); } }
  10. 10. Intent • An intent is an abstract description of an operation to be performed. • 「Intentとは実行される操作の抽象的な単位です。」 ▫ 一つのアクティビティ内のウィジェットやイベントは単 一のスレッドで実行される ▫ Handlerドリブン、Looperでのループ ▫ でも、そうとは限らないので、画面遷移をはじめとする あらゆるコンポーネント間連携を隠ぺいする(開発者 が楽になり、繋がりやすくなる)
  11. 11. ComponentName • private ComponentName mComponent; ▫ インテントの宛先のこと ▫ 明示的なインテント(Explicit Intents)  Intent(Context packageContext, Class cls)や、 setComponentメソッドなどによって、そのインテントを取り扱う コンポーネントを「明示的」に指定されたもの  宛先を特定する情報は他には要らない ▫ 暗黙的なインテント(Implicit Intents)  宛先のコンポーネントを指定されていないもの  そのIntentを動かすにあたってどのコンポーネントが最適であ るかを決定するための十分な情報が必要
  12. 12. Can I ask? •呼び出したActivityから戻るときは? •呼び出したActivityから結果を受け 取るときは?
  13. 13. Can I ask? •呼び出したActivityから戻るときは? finish •呼び出したActivityから結果を受け 取るときは? startActivityForResult setResult onActivityResult
  14. 14. startActivityForResult public class A extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a); } public void click(View v) { Intent i = new Intent(this, B.class); startActivityForResult(i, 0); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); ・・・ } }
  15. 15. startActivityForResult あくまでも例ですが。 public class B extends Activity { ・・・ @Override protected void onPause() { super.onPause(); setResult(10); finish(); } }
  16. 16. Can I ask? •複数画面にまたがるときはどうやって 受け渡す?(such as A -> B -> C)
  17. 17. Can I ask? •複数画面にまたがるときはどうやって 受け渡す?(such as A -> B -> C) startActivityResultの数珠つなぎ ほか、色々. いくつかご紹介します
  18. 18. static •staticな入れ物(クラス変数)に入れ ておけばいい public class A extends Activity { static int val; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a); } public void click(View v) { System.out.println(++val); } }
  19. 19. Can I ask? •気を付けるべきことは?
  20. 20. Can I ask? •気を付けるべきことは? アプリの終了ではなくプロ セスが死ぬまで覚えている 同期化されない など、他にも実はいろいろです。
  21. 21. android.app.Application •Activity ≒ 画面 (短命) •Appication ≒ アプリ (長寿) public class MyApplication extends Application { public String val; }
  22. 22. android.app.Application •AndroidManifest.xml <application android:icon="@drawable/icon" android:label="@string/app_name" android:name=".MyApplication"> <activity android:name=".A" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".B" android:label="@string/app_name"> </activity> </application>
  23. 23. Can I ask? •気を付けるべきことは?
  24. 24. Can I ask? •気を付けるべきことは? アプリを終了したら忘れる 別プロセスは別アプリイン スタンス など
  25. 25. ファイルに保存 •android.context.Context •abstract FileInputStream openFileInput(String name) Open a private file associated with this Context's application package for reading. •abstract FileOutputStream openFileOutput(String name, int mode) Open a private file associated with this Context's application package for writing. •普通にjava.ioでもできます。(アクセスできる場所なら)
  26. 26. キャッシュ •android.context.Context# getCacheDir() •public abstract File getCacheDir () Returns the absolute path to the application specific cache directory on the filesystem.
  27. 27. Can I ask? •気を付けるべきことは?
  28. 28. Can I ask? •気を付けるべきことは? キャッシュは消えるかも 同期化など デカくし過ぎると迷惑 アンインストールしたら忘れる など
  29. 29. SharedPreferences •KEY,VALUE •アプリごとのデータ領域に置かれる Context context = getApplicationContext(); SharedPreferences pref = (SharedPreferences) PreferenceManager.getDefaultSharedPreferences(context); // 読む場合 String val1 = pref.getString("KEY_1", ""); int val2 = pref.getInt("KEY_2", -1); // 書く場合 pref.edit().putBoolean("KEY_3", true).commit();
  30. 30. Can I ask? •気を付けるべきことは?
  31. 31. Can I ask? •気を付けるべきことは? デカくなると遅くなる(XML) 複数プロセスからのアクセ スは同期化されない Note: currently this class does not support use across multiple processes. This will be added later. など
  32. 32. 【参考】他のアプリのContextを取る •foo.barアプリの、あるアクティビティで保存 getSharedPreferences("HOGEHOGE", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE).edit().putInt("value", 10).commit(); •別のアプリから、foo.barアプリのContextを取る Context otherAppContext = null; try { otherAppContext = createPackageContext("foo.bar", Context.MODE_WORLD_READABLE); } catch (NameNotFoundException e) { } Context context = otherAppContext.getSharedPreferences("HOGEGOGE", 0);
  33. 33. その他の方法(一例) •Serviceで管理する •別アプリに覚えさせておく •端末の外に覚えさせておく •DropboxのようなストレージでもいいしApp Engineなどでもいい •同期例:Sample Sync Adapter(development/samples/SampleSyncAdapter/) •SQLiteに記録する •ContentProviderに置く •独自で公開してもよいし、ギャラリーの画像のExifデータに 置く( #uso800

×