Tokyo GTUG Bootcamp2010
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Tokyo GTUG Bootcamp2010

  • 3,210 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,210
On Slideshare
3,210
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
53
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Tokyo GTUG主催 Bootcamp 2010 Android: Activity間の情報の受け渡し方 江川 崇(@t_egg/ egg)
  • 2. 自己紹介 • 江川 崇(EGAWA Takashi) • プログラマー • egg / @t_egg • Android Developers’ Club(デ部) • Android プログラミング入門 • IMoNiなど
  • 3. 今日お話ししたいこと 「Activity間の情報の受け渡し方」
  • 4. 今日お話ししたいこと 「Activity間の情報の受け渡し方」 たくさんありますが、今回はその中でも、なるべく簡 単にできる方法をご紹介します。 私も知らないことがたくさんありますし、皆さんと一 緒に理解を深めていきたいので、随時質問して下さ い。
  • 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. 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. Can I ask? •ボタンが押されたときに、clickメソッ ドが呼ばれます。紐付けはどこで? •startActivityが呼ばれると何が起き ますか?
  • 8. Can I ask? •ボタンが押されたときに、clickメソッ ドが呼ばれます。紐付けはどこで? android:onClick •startActivityが呼ばれると何が起き ますか? 指定されたActivityが最前面に来る ※ Activityを選択するDialogが出るか、Activityが 見つからずにエラーになるケースもある
  • 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. Intent • An intent is an abstract description of an operation to be performed. • 「Intentとは実行される操作の抽象的な単位です。」 ▫ 一つのアクティビティ内のウィジェットやイベントは単 一のスレッドで実行される ▫ Handlerドリブン、Looperでのループ ▫ でも、そうとは限らないので、画面遷移をはじめとする あらゆるコンポーネント間連携を隠ぺいする(開発者 が楽になり、繋がりやすくなる)
  • 11. ComponentName • private ComponentName mComponent; ▫ インテントの宛先のこと ▫ 明示的なインテント(Explicit Intents)  Intent(Context packageContext, Class cls)や、 setComponentメソッドなどによって、そのインテントを取り扱う コンポーネントを「明示的」に指定されたもの  宛先を特定する情報は他には要らない ▫ 暗黙的なインテント(Implicit Intents)  宛先のコンポーネントを指定されていないもの  そのIntentを動かすにあたってどのコンポーネントが最適であ るかを決定するための十分な情報が必要
  • 12. Can I ask? •呼び出したActivityから戻るときは? •呼び出したActivityから結果を受け 取るときは?
  • 13. Can I ask? •呼び出したActivityから戻るときは? finish •呼び出したActivityから結果を受け 取るときは? startActivityForResult setResult onActivityResult
  • 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. startActivityForResult あくまでも例ですが。 public class B extends Activity { ・・・ @Override protected void onPause() { super.onPause(); setResult(10); finish(); } }
  • 16. Can I ask? •複数画面にまたがるときはどうやって 受け渡す?(such as A -> B -> C)
  • 17. Can I ask? •複数画面にまたがるときはどうやって 受け渡す?(such as A -> B -> C) startActivityResultの数珠つなぎ ほか、色々. いくつかご紹介します
  • 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. Can I ask? •気を付けるべきことは?
  • 20. Can I ask? •気を付けるべきことは? アプリの終了ではなくプロ セスが死ぬまで覚えている 同期化されない など、他にも実はいろいろです。
  • 21. android.app.Application •Activity ≒ 画面 (短命) •Appication ≒ アプリ (長寿) public class MyApplication extends Application { public String val; }
  • 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. Can I ask? •気を付けるべきことは?
  • 24. Can I ask? •気を付けるべきことは? アプリを終了したら忘れる 別プロセスは別アプリイン スタンス など
  • 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. キャッシュ •android.context.Context# getCacheDir() •public abstract File getCacheDir () Returns the absolute path to the application specific cache directory on the filesystem.
  • 27. Can I ask? •気を付けるべきことは?
  • 28. Can I ask? •気を付けるべきことは? キャッシュは消えるかも 同期化など デカくし過ぎると迷惑 アンインストールしたら忘れる など
  • 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. Can I ask? •気を付けるべきことは?
  • 31. Can I ask? •気を付けるべきことは? デカくなると遅くなる(XML) 複数プロセスからのアクセ スは同期化されない Note: currently this class does not support use across multiple processes. This will be added later. など
  • 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. その他の方法(一例) •Serviceで管理する •別アプリに覚えさせておく •端末の外に覚えさせておく •DropboxのようなストレージでもいいしApp Engineなどでもいい •同期例:Sample Sync Adapter(development/samples/SampleSyncAdapter/) •SQLiteに記録する •ContentProviderに置く •独自で公開してもよいし、ギャラリーの画像のExifデータに 置く( #uso800