こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Androidのデータ受け渡し

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

投稿日時 - 2018-01-29 19:47:04

QNo.9423606

暇なときに回答ください

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

>別のActivityによって自分のActivityが隠される、ホーム・キーで自分のActivityが(実行中で)非表示になる、プロセスがキルされるなどを考慮すると、「onResume()」メソッドでロード、「onPause()」メソッドでセーブと言う感じでしょうか。

↑これは長期的な記憶の場合でした(Preferenceと言うと ついつい長期的な記憶を想定してしまいがちになってしまいまいた)、データの受け渡し程度なら必要ありません。

投稿日時 - 2018-01-31 17:58:25

補足

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

投稿日時 - 2018-01-31 22:46:20

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.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);
}
}

投稿日時 - 2018-01-30 21:39:53

ANo.6

>プリファレンスを一時的なデータの共有に使用する場合何かデメリットがあるのでしょうか?

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

投稿日時 - 2018-01-30 21:17:05

ANo.5

>プリファレンスを一時的なデータの共有に使用する場合

アプリケーション内でのみの一時的な記憶なら「onCreate()」メソッドでクリアとか、その他でもクリアのタイミングを考慮して下さい。

投稿日時 - 2018-01-30 20:58:06

ANo.4

>シングル・インスタンスに話を限定すれば

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

投稿日時 - 2018-01-30 20:35:21

ANo.3

>表示が隠れている実行中の自分のActivityが表示されたら どのメソッドが呼ばれるのか、下記「アクティビティのライフサイクル」を参照して下さい、問題はプロセスがキルされる場合があり、その場合はPreferenceのデータをサイロードする必要があると言う事です(Preference以外のデータにも不整合があってはダメです)

別のActivityによって自分のActivityが隠される、ホーム・キーで自分のActivityが(実行中で)非表示になる、プロセスがキルされるなどを考慮すると、「onResume()」メソッドでロード、「onPause()」メソッドでセーブと言う感じでしょうか。

ただしプロセスがキルされた場合、「onDestroy()」メソッドが呼ばれてない事に注意して下さい。
シングル・インスタンスに話を限定すれば「onCreate()」メソッドが呼ばれ、「onDestroy()」メソッドが呼ばれずに、再び「onCreate()」メソッドが呼ばれた場合はプロセスがキルされた証となります(シングル・インスタンスはAndroidManifest.xmlで「launchMode="singleInstance"」を設定)。
プロセスがキルされたか知りたい場合は「onCreate()」メソッドが呼ばれたか、「onDestroy()」メソッドが呼ばれたかなどをPreferenceなどに保存して判定して下さい(普通 趣味なら そこまで厳密に考えなくでも良いでしょうけど)。

投稿日時 - 2018-01-30 20:28:53

ANo.2

>プリファレンスを一時的なデータの共有に使用する場合何かデメリットがあるのでしょうか?

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

アクティビティのライフサイクル
http://www.javadrive.jp/android/activity/index2.html

投稿日時 - 2018-01-30 20:02:39

ANo.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/

投稿日時 - 2018-01-29 21:38:50

補足

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

投稿日時 - 2018-01-30 00:13:42

あなたにオススメの質問