• ベストアンサー

Androidのデータ受け渡し

MainActivityがありまして、FragmentAとFragmentBがあります。 FragmentAで作成されたデータをよく使われるInterfaceを使用したコールバックでMainActivityに渡します。そしてMainActivityにあるFragmentAが作成したデータをFragmentBで任意の時にMainActivityに取りに行きたいのですがこんなことできるでしょうか?探してもやり方が見つからないのでプリファレンスを利用しようかなとも思いましたが、データの永続化ではなく、単なるデータの受け渡しでプリファレンスを使用してもいいものでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.8

>別のActivityによって自分のActivityが隠される、ホーム・キーで自分のActivityが(実行中で)非表示になる、プロセスがキルされるなどを考慮すると、「onResume()」メソッドでロード、「onPause()」メソッドでセーブと言う感じでしょうか。 ↑これは長期的な記憶の場合でした(Preferenceと言うと ついつい長期的な記憶を想定してしまいがちになってしまいまいた)、データの受け渡し程度なら必要ありません。

takahasi5634
質問者

補足

回答を読んでいるとまったく気にしていないものが出てきて非常に勉強になりました。 教えて頂いたことを参考にして実装したいと思います。 ありがとうこざいました。

その他の回答 (7)

回答No.7

下記は当方の なんちゃってシングル・インスタンスの主要部分です(キルされた場合には対応していません)。 当方は「Activity」に「AppCompatActivity」を使っています。 「MyApplication」は「AndroidManifest.xml」で「Application」として定義しています。 public class MyApplication extends Application { static volatile ArrayList<AppCompatActivity> dl1oActivity = new ArrayList<AppCompatActivity>( ); @Override public void onCreate( ) { super.onCreate( ); ~ } } public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); for(int i = MyApplication.dl1oActivity.size( )-1; 0<=i; i--){ MyApplication.dl1oActivity.get(i).finish( ); // MyApplication.dl1oActivity.remove(i); } MyApplication.dl1oActivity = new ArrayList<AppCompatActivity>( ); MyApplication.dl1oActivity.add(this); } @Override protected void onDestroy( ) { super.onDestroy(); MyApplication.dl1oActivity.remove(this); } } 全てのサブ・アクティビティーの「onCreate( )」メソッドに「MyApplication.dl1oActivity.add(this);」、全てのサブ・アクティビティーの「onDestroy( )」メソッドに「MyApplication.dl1oActivity.remove(this);」を記述する必要があります。 public class SubActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyApplication.dl1oActivity.add(this); } @Override protected void onDestroy( ) { super.onDestroy(); MyApplication.dl1oActivity.remove(this); } }

回答No.6

>プリファレンスを一時的なデータの共有に使用する場合何かデメリットがあるのでしょうか? あ!多重起動を許すと問題が発生します、前の自分のアプリケーションが使ってるPreferenceを新しい自分のアプリケーションのPreferenceが上書きしてしまいます。 シングル・インスタンスしするにはAndroidManifest.xmlで「launchMode="singleInstance"」を設定すれば良いのですが、ランチャーによっては「launchMode="singleInstance"」の指定を無視して多重起動を許すアプリがあるので、多重起動した場合に自分で前の自分のアプリケーションを終了する必要があります(多重起動したモノを自分で閉じるので、こらは真のシングル・インスタンスではなく、なんちゃってシングル・インスタンスです)。

回答No.5

>プリファレンスを一時的なデータの共有に使用する場合 アプリケーション内でのみの一時的な記憶なら「onCreate()」メソッドでクリアとか、その他でもクリアのタイミングを考慮して下さい。

回答No.4

>シングル・インスタンスに話を限定すれば 申し訳ございません、ランチャーによっては「launchMode="singleInstance"」の指定を無視して多重起動を許すアプリがあるので、前述の手法はダメですね。 プロセスがキルされたかは検出不能と言うことで…。

回答No.3

>表示が隠れている実行中の自分のActivityが表示されたら どのメソッドが呼ばれるのか、下記「アクティビティのライフサイクル」を参照して下さい、問題はプロセスがキルされる場合があり、その場合はPreferenceのデータをサイロードする必要があると言う事です(Preference以外のデータにも不整合があってはダメです) 別のActivityによって自分のActivityが隠される、ホーム・キーで自分のActivityが(実行中で)非表示になる、プロセスがキルされるなどを考慮すると、「onResume()」メソッドでロード、「onPause()」メソッドでセーブと言う感じでしょうか。 ただしプロセスがキルされた場合、「onDestroy()」メソッドが呼ばれてない事に注意して下さい。 シングル・インスタンスに話を限定すれば「onCreate()」メソッドが呼ばれ、「onDestroy()」メソッドが呼ばれずに、再び「onCreate()」メソッドが呼ばれた場合はプロセスがキルされた証となります(シングル・インスタンスはAndroidManifest.xmlで「launchMode="singleInstance"」を設定)。 プロセスがキルされたか知りたい場合は「onCreate()」メソッドが呼ばれたか、「onDestroy()」メソッドが呼ばれたかなどをPreferenceなどに保存して判定して下さい(普通 趣味なら そこまで厳密に考えなくでも良いでしょうけど)。

回答No.2

>プリファレンスを一時的なデータの共有に使用する場合何かデメリットがあるのでしょうか? 実態はファイルと言うことで、「セーブ、ロード」のタイミングを間違うとデータが更新されずに、古いデータになってしまうと言う事ぐらいでしょうか。 自分のActivityが表示中に他のActivityが表示されたら どのメソッドが呼ばれるのか、表示が隠れている実行中の自分のActivityが表示されたら どのメソッドが呼ばれるのか、下記「アクティビティのライフサイクル」を参照して下さい、問題はプロセスがキルされる場合があり、その場合はPreferenceのデータをサイロードする必要があると言う事です(Preference以外のデータにも不整合があってはダメです)、まあ趣味なら そこまで厳密に考えなくでも良いでしょうけど。 当方はPreferenceがウマく動作しなかったので、結局Preference的なものを自分で作るハメになってしまいましたが…(端末側のOSの問題か?)。 アクティビティのライフサイクル http://www.javadrive.jp/android/activity/index2.html

回答No.1

static変数なら自由にアクセスできるのでは? ただし、Activityのstatic変数は問題があるようなので、Applicationのstatic変数を使う必要があるようです(AndroidManifest.xmlで設定が必須、詳細は下記参照)。 static変数だとsynchronizedできないと言う問題点がありますが。 Androidのタスクとプロセスの話。/あるいは、「Androidのstatic変数は勝手にクリアされる」という迷信についての話。 http://quesera2.hatenablog.jp/entry/2015/03/02/220115 android の static 変数 が気持ち悪い - android ファッション通信 Σ(^A^;) https://android.benigumo.com/20140223/android-%E3%81%AE-static-%E5%A4%89%E6%95%B0-%E3%81%8C%E6%B0%97%E6%8C%81%E3%81%A1%E6%82%AA%E3%81%84/ Applicationクラスを継承して、データの共有をする。 https://techbooster.org/android/application/2353/

takahasi5634
質問者

補足

回答ありがとうございます。教えて頂いたページを読みましてなんとなくApplicationクラスを継承したデータ共有がいいと思いましたが、プリファレンスのほうが簡単な気がしました。 Applicationクラスを継承してデータの共有とプリファレンスで共有とではどちらがいいと思いますか? プリファレンスを一時的なデータの共有に使用する場合何かデメリットがあるのでしょうか?

関連するQ&A

  • Android開発でお聞きしたいことがあります。

    プリファレンスを使用してActivity間でデータの受け渡しをしたいのですが、 layoutのxmlファイルで定義したid( EditText→@+id/a ) を取得して(EditText edit =(EditText)findViewByid(R.id.a); ) editをプリファレンスに書き込みしたいです。 プリファレンスを定義した後、 editor.putString("data1",edit); でエラーが出てしまいます。 私では editにid aを取得し、String型としてプリファレンスに書き込みたいのですが、 間違いなどありましたらご指摘、お願いします。 質問させていただいて申し訳ないのですが、詳しい修正方法もできたらお願いします。

  • データ受け渡しについて

    毎回お世話になっております。アドバイス頂きたくて質問させて頂きます。 現在インターネットビジネスを行っております。職種と致しましては印刷関係です。広告などのデザインなどを中心に行っております。 そこでお客様とのデータの受け渡しの機会が非常に多いのですが、データが大きく受け渡しに困っております。今までは宅○ぁいる便を利用させて頂いていたのですが、お客様などにも登録が必要で手間を取らせていました。 そこで下記質問につき皆様のアドバイスをお願い致します。 1.フリーなら一番良いのですが多少お金がかかっても良いので、相手の方が登録無しで利用できるメールなどはありますか?容量と致しましては最低50MB、理想と致しましては100MBあればと思っています。 2.できればこの方法が一番良いのですが、レンタルフォームなどにアクセスして頂き、データを送っていただく方法はありますでしょうか?その際、簡単なフォーム構成などを編集できれば最高なのですが・・・。 以上につきアドバイスお願い致します。 その他にも、50~100MBのデータをお客様に最小限の手間で効率よく受け渡しできる方法がありましたらアドバイスお願い致します。多少の金銭の発生はあっても良いと考えております。 宜しくお願い致します。

  • cakephp2.5のフォームデータの受け渡し

    CakePHP2.5でフォームからpostでデータをコントローラで受け取って 別のページで表示するにはどうすればいいでしょうか フレームワークを使用しない普通のPHPならば以下のようになります。 $_POST('paramater'); ただ、CakePHPの場合だとどのようにしていいか不明です。 調べた結果以下のものが出てきたのですが 今回はモデルを使用しないでデータを受渡ししようと思っています。 $this->request->data['model']['field']; モデルを利用しないでデータの受け渡しをする方法をお教えください。 なかなかいい参考資料も出てきません

    • 締切済み
    • PHP
  • Form間のデータの受け渡し

    VB2005で Form1でボタン操作を行ってForm2を表示させ、 そこで簡単なデータの入力を行って、 そのデータをForm1で使用する、ということをしたいのですが、 Form間のデータの受け渡しはどうしたらいいのでしょうか?

  • モジュール間のデータ受け渡し

    初心者質問で申し訳ございませんが、 ご教授、お願いできませんでしょうか? 環境は XP, VB,net2005を使用しています。 言葉が適切かどうかわかりませんが、 別ファイルのモジュール同士でのデータの受け渡しはどのように行えばいいのでしょうか? たとえば、Form1.vbに定数宣言してある「定数1」を 別で作成したModule.vbには定数を読み込むにはどのように行ったらよいのでしょうか? パブリック変数の位置で宣言したのですが、参照できないようで… ご回答いただけましたら幸いです。

  • データの受け渡しについて

    現在、出席票のプログラムを作っていて出てきた質問です。ただし私がJAVA初心者なため、質問もとても初歩的な部分だとは思いますが、どうぞよろしくお願いいたします。 このプログラムは2つのファイルから成り立たせたいと考えています。1つ(以下:DBTest_a)ではJAppletによってパスワードを入力する。もう2つ(以下:DBTest_b)ではDBTest_aで得たパスワードを受け取り、データベースに接続して各処理を行う(この処理内容もパスワードを表示させたウインドーで表示させたい)。というものです。 受け取るには、DBTest_aをメインにして、 str にパスワードを保持して、DBTest_bをDBTest_a内で呼び出して受け渡そうと考えました。 そのためのパスワードを入力して保持するプログラムと、データベースに接続するプログラムを別々に作成して、個別には実行できるようにはなりました。しかし、DBTest_bへのデータの受け渡しがうまく行かないままです。 現在のDBTest_bでは" JOptionPane.showInputDialog "を使って、パスワードを簡単に入力ができるようにしています。このプログラムの目的が、【キーボードからパスワードを入力して、データベースに接続】ならこれでもいいのですが、この先このプログラムを拡張する(「出席」「欠席」ボタンを押して出席率を変化せせるなどのイベントをつける予定です)ときに" JOptionPane.showInputDialog "だと都合が悪いと思い" JOptionPane.showInputDialog "を用いる必要があるなと感じました。上記で説明したデータの受け渡しがうまくいけば、拡張もできるのではないかと考えています。 長々と私の考えを載せてしまいましたが、重要な質問は【2つのプログラム間でのデータの受け渡し方法】です。

    • ベストアンサー
    • Java
  • インターネットでデータ受け渡しをするには?

    はじめまして。 会社のパソコンと自宅のパソコンでメールで送れない程の量の データを受け渡ししたいのですが、 どちらかがサーバーとしてインターネット接続して出来るでしょうか? また常時接続でなくてもプロバイダ経由の接続でも出来るでしょうか? やり方等教えてください。 Fetchでホームページをアップしたことがある程度の初心者です。 自宅の使用パソコンはMacです。

  • C#のフォーム間のデータの受け渡しについて

    はじめまして。よろしくお願いします。 最近C#をはじめましたがいきなりつまづいてしまいました。 クラスを利用しフォーム間でデータの受け渡しをしたいのですがどうすればいいのでしょうか? 処理は以下のようになっております まず、フォームが2つあります。フォーム1とフォーム2とします。 最初に起動されるのがフォーム1で、フォーム1にはボタンが2つあります。ボタンA、ボタンBとします ボタンA、ボタンBどちらのボタンを押下しても、フォーム2が開きますがどちらを押されてたかをフォーム2のテキストボックス(テキスト2とします)に表示します。 クラスですがフォームが2つとデータ保持のためのクラスが1つ(データ保持クラスとします)があります。 データ保持クラスにはint形のBtnClickプロパティ(get,set)を作成しております。, フォーム1のボタンA押下時処理  データ保持クラスのBtnClickに1を格納し、フォーム2を開きます。 フォーム1のボタンB押下時処理  データ保持クラスのBtnClickに2を格納し、フォーム2を開きます。 フォーム2起動時処理  データ保持クラスのBtnClickから値を取得しフォーム2のテキスト2へ表示します。 で、肝心の質問ですが、データ保持クラスの宣言はどこにすればいいのでしょうか? また、インスタンスはどのタイミングで作成すればいいのでしょうか? フォーム1にpublicとして宣言しインスタンスを作成し、ボタン押下時にBtnClickプロパティーにデータを格納し・・・ というところまではできたのですが、フォーム2で値が取得できないどころか、コンパイルが通りません。 あと、こういうデータ保持クラス使い方って一般的ですか?? 長々と脈略もなく書きましたがご教授ください。どうぞよろしくお願いします。

  • シングルコーテーションのデータ受渡し方法

    現在PHPとMySQLで初めてシステムの作成をしていて、データの受渡し方に悩んでいます。 FormでPOSTのデータの「'」の受渡しで、現在はPHP内で $body .= "<FORM NAME='objform' ACTION='form_check.php' METHOD='POST'> <INPUT TYPE='hidden' NAME='name' VALUE='$name'></FORM>" のようにすると、$nameに途中に「'」が入ってしまった場合、途中で切れた文字が受け渡されてしまいます。 そこで、 print <<< EOF <FORM NAME="objform" ACTION="form_check.php" METHOD="POST"> <INPUT TYPE="hidden" NAME="bunrui" VALUE="$bunrui"> </FORM> EOF; のようにして、受渡しは出来たのですが、Javascriptの併用で、 <input type="button" value="編集" onclick="EditExec('$name', '$namae_cd');"> のように、引数を複数渡す時に「'」を使うとjavascriptが動かなくなってしまいました。 皆さんはデータ受渡しの時はどのように行っているのでしょうか? もし良い解決策がありましたらご教授下さい。

    • ベストアンサー
    • PHP
  • 2つのネットワークでのデータの受け渡し方法案

    2つのローカルネットワークがある中、データの受け渡しを行いたい際、 簡単に考えると、USBフラッシュメモリを使用したり、CD-RWがあればそれを使って 行うと良いとは思うのですが、それ以外で行うとすればなにか良い方法はありますか? 例えば、各ローカルネットワークの代表PC1台にLANボードを追加し、 クロスケーブルを使ってのデータの受け渡しが可能でしょうか? 出来れば、USBの口は使わないで出来たらと考えています。

専門家に質問してみよう