Activity [A]
│ ↑ 手動で戻る
↓ 起動 │
Activity [B]
│ ↑ 手動で戻る
↓ 起動 │
Activity [C]
├ マルチスレッド 1 開始
├ マルチスレッド 2 開始
└ マルチスレッド 3 開始
上記のような、Activity をまたぐ構成で、Activity [C] 内から、マルチスレッドで処理を実行させています。
これらのマルチスレッド処理が完了した際に、最初に起動した Activity [A] の画面内の表示しているデータを更新させたいのですが、どうに
も解決方法が見つかりません。
実現したい動作
・Activity [A] の画面がアクティブな状態の場合、Activity [C] 内から実行している、各スレッド処理が完了したら
Activity [A] の画面を更新する。
・Activity [A] の画面がアクティブな状態でない場合、スレッドが完了しても Activity [A] を起動したくない(裏側にいたま
まにしたい)
上記動作の実現方法に付きまして、どなたかご教示いただけませんでしょうか?
ピーシークラフトです。
Activity間を跨ぐようなタスクはサービスもしくは継承した Application でマルチスレッド処理をされてはいかがでしょうか。
Activityはいつ殺されてもおかしくないのでまともな処理は任せられません。
早速の返信ありがとうございます。
タスク、サービスについて、まだよく理解できておりませんが、サービスということは画面を持たずに、処理をバックグラウンドで走らすということになりま
すよね?
イメージ的には、Activity [C] から、サービスを起動し、サービスの中からマルチスレッド処理を実行し、スレッドが終了した時点で
Activity [A] に intent を送信するといった感じになるのでしょうか?
以上、よろしくお願いいたします。
--
このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。
サービスを利用しないのであれば、 Activity C の処理を
Application に移してみてはいかがでしょうか?
-------------------------------------------
処理1
マルチスレッド 1 開始
処理2
マルチスレッド 2 開始
処理3
マルチスレッド 3 開始
スレッド終了時コールバック
Activity [A] 画面変更
-------------------------------------------
Activity [A]
│ ↑ 手動で戻る
↓ 起動 │
Activity [B]
│ ↑ 手動で戻る
↓ 起動 │
Activity [C]
Application 処理1をコール;
Application 処理2をコール;
Application 処理3をコール;
On 2月2日, 午後9:37, "i...@pc-craft.co.jp" <pccraftc...@gmail.com> wrote:
返信ありがとうございます。
ご教示いただきました処理の場合、必ずスレッド処理が完了してから、Activity B から Actibity A に画面遷移しないと、スレッド
の結果が反映されないということはないでしょうか?
Activity A に画面を表示している状態で、Activity C から実行しているスレッド処理が完了した時点で、スレッドの結果を
Activity A の画面を更新するといったことをやりたいのですが、A → B → C → スレッドα開始 → B → A → スレッドα完
了としたタイミングで、Aの画面を更新できない気がするのですが。
以上、よろしくお願いいたします。
On 2月3日, 午前1:52, Daisuke Miyakawa <d.miyak...@gmail.com> wrote:
> みやかわです。
>
> ピーシークラフト様と別のアイディアを参考まで
>
> Activity A -> (startActivityForResult()) -> Activity B ->
> (startActivityForResult()) -> Activity C
>
> と startActivityForResult() を使って Activity B と Activity C を起動し、
> Activity C でスレッドが正しい結果を特定のメンバ変数に書き込んだ場合に Activity B にその結果を Result として返し、
> Activity B も Activity A にその結果を返す
>
> というのはどうでしょうか。
>
> それでは
>
> 2010年2月2日7:21 ma <coolw...@v001.vaio.ne.jp>:
> > このグループから退会するには、android-sdk-ja...@googlegroups.com<android-sdk-j-apan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-sdk-japan?hl=jaからこのグループにアクセスしてください。
>
> --
> Daisuke Miyakawa (宮川大輔)
> d.miyak...@gmail.com- 引用テキストを表示しない -
>
> - 引用テキストを表示 -
返信ありがとうございます。
以下、メッセージを引用させていただきます。
On 2月3日, 午前8:59, "i...@pc-craft.co.jp" <pccraftc...@gmail.com> wrote:
> ピーシークラフトです。
>
> サービスを利用しないのであれば、 Activity C の処理を
> Application に移してみてはいかがでしょうか?
>
> -------------------------------------------
>
> 処理1
> マルチスレッド 1 開始
> 処理2
> マルチスレッド 2 開始
> 処理3
> マルチスレッド 3 開始
>
> スレッド終了時コールバック
> Activity [A] 画面変更
>
> -------------------------------------------
>
> Activity [A]
>
> │ ↑ 手動で戻る
> ↓ 起動 │
>
> Activity [B]
>
> │ ↑ 手動で戻る
> ↓ 起動 │
>
> Activity [C]
>
> Application 処理1をコール;
> Application 処理2をコール;
> Application 処理3をコール;
すみません、初心者なもので、まだよく理解できていないのですが、
この場合の、「Application」としているのは、 Activity [A], Activity [C] とは、別パッケージになるのでしょ
うか?
Application は、Activity [C] からの命令を受けて、スレッドを発行し、各スレッドが終了するタイミングで、
Application がActivity [A] に対し、intent を送信するイメージですよね?また、Activity [A] は
Application のコールバックを受け取る implements できる Interface か何かあるのでしょうか?
以上、よろしくお願いいたします。
> > > 上記動作の実現方法に付きまして、どなたかご教示いただけませんでしょうか?- 引用テキストを表示しない -
>
> - 引用テキストを表示 -
>「Application」としているのは、 Activity [A], Activity [C] とは、別パッケージになるのでしょ
うか?
同じパッケージで OK です。
Android アプリには階層があります。
OS > 1つの Application クラス > 複数の Activity クラスや Service クラス
Eclipse の自動プロジェクト作成では Application クラスは作られません。
これは個人的にはよくない仕様だと思います。
自動で作られないから無いのではなく、どんなアプリにも Application クラスは必ず存在しているはずです。
まずは Application クラスの派生クラスを追加して下さい。
http://developer.android.com/intl/ja/reference/android/app/Application.html
江川です。
みやかわさんがご提示された方法で、アクティビティCからAに簡単に戻すことができると思います。
処理が完了する前にCを閉じていることもあり得る場合は、ピーシークラフトさんが
おっしゃる通りではないかと思います。アクティビティよりもライフサイクルが長い処理は、
アクティビティでやらせない方がよいと思います。
> イメージ的には、Activity [C] から、サービスを起動し、サービスの中からマルチスレッド処理を実行し、スレッドが終了した時点で
> Activity [A] に intent を送信するといった感じになるのでしょうか?
サービスを起動するのはどこでも構いませんし、マルチスレッドにしなくとも構いませんが
アクティビティAを常に表示したい場合は上の方法で実現できると思います。
表示されているアクティビティによって振る舞いを変えたいときは
サービスからアクティビティへコールバックし、アクティビティ側で
判断する方法などがあります。後はピーシークラフトさんご提示の
Applicationクラスを継承する方法などです。
------------------------------------------
EGAWA Takashi
2010年2月3日0:21 ma <cool...@v001.vaio.ne.jp>:
> --
> このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
> このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
大変参考になる、ご教示ありがとうございます。
まずは、 Application の拡張クラスから試して見ようと思っていますが、ひとつヒントを頂ければ幸いです。
Activity [C] から、Application の Extends クラスのインスタンスを生成した場合、Activity [A] に
も、Activity [C] から発行した Application の Extends クラスのインスタンス を参照する必要があると言うことに
なりますよね?
とすると、まず最初の起動 Activity [A] でインスタンスを生成した上で、 さらに Activiyy [C] でインスタンスを参照する
と言った形でしょうか?シングルトンのイメージですかね?
スレッドの完了通知を Activity [A] で、受け取り口としての、定義が必要になると理解していますが、CallBack メソッドという
ものは、 Application クラスのAPI HELP 見ると見当たらないのですが、onConfigurationChanged を使うの
でしょうか?
以上、よろしくお願いいたします。
On 2月4日, 午前2:29, Daisuke Miyakawa <d.miyak...@gmail.com> wrote:
> ma様
>
> みやかわです。
>
> 当方の理解不足の部分があったようですみません。Activity Cから離れてもバックグラウンドで走らせたい処理がある、ということですね
>
> Activity C から離れた時点 (Activity Bに戻るか、ユーザが Home ボタンを押したときなど) で、Activity
> Cが起動したスレッドはいつ強制終了してもおかしくない状態になります。
> Activity B や、Home ボタン経由で当該アプリケーションを一時停止されたときにもスレッドが動いてほしい、ということであれば、
> それは Activity A, B, C
> とは独立した別の実行単位にする方が良い、というのがピーシークラフトさんが提示されている方法の基本的な考え方だと思います。
>
> その場合、Serviceクラスか、Applicationクラスを使って元のActivity A, B,
> Cとは完全に独立した実行単位として、その「スレッド」に相当するものが存在することをAndroidに伝えるのが良いかと思います。
>
> 以前のメールからの引用を失礼します。
>
> >タスク、サービスについて、まだよく理解できておりませんが、サービスということは画面を持たずに、処理をバックグラウンドで走らすということになりますよね-?
>
> > イメージ的には、Activity [C] から、サービスを起動し、サービスの中からマルチスレッド処理を実行し、スレッドが終了した時点で
>
> Activity [A] に intent を送信するといった感じになるのでしょうか?
> イメージとしてはこの理解で正しいです。技術的には Intent
> オブジェクトではなく、共有しているデータベースやSharedPreferenceのデータなどに書き込むのではないかな、と。
> IntentはActivityを「起動」するイメージなので、今回のように Activity A
> に既に戻っていて、その状態で「スレッド」が終わったときにActivity Aに送るものとしては若干不適切かな、という感じがします。
>
> Activity
> を跨ぐ処理なのであればユーザには「今バックグラウンドで処理中です」と伝えた方が良いと思うので、個人的にはServiceかApplicationで独立起-動が良いかな、と思います。
>
> ご期待に添えれば幸いです。
>
> 2010年2月3日6:22 egg <t.eg...@gmail.com>:
>
>
>
>
>
> > maさん
>
> > 江川です。
>
> > みやかわさんがご提示された方法で、アクティビティCからAに簡単に戻すことができると思います。
> > 処理が完了する前にCを閉じていることもあり得る場合は、ピーシークラフトさんが
> > おっしゃる通りではないかと思います。アクティビティよりもライフサイクルが長い処理は、
> > アクティビティでやらせない方がよいと思います。
>
> > > イメージ的には、Activity [C] から、サービスを起動し、サービスの中からマルチスレッド処理を実行し、スレッドが終了した時点で
> > > Activity [A] に intent を送信するといった感じになるのでしょうか?
>
> > サービスを起動するのはどこでも構いませんし、マルチスレッドにしなくとも構いませんが
> > アクティビティAを常に表示したい場合は上の方法で実現できると思います。
> > 表示されているアクティビティによって振る舞いを変えたいときは
> > サービスからアクティビティへコールバックし、アクティビティ側で
> > 判断する方法などがあります。後はピーシークラフトさんご提示の
> > Applicationクラスを継承する方法などです。
>
> > ------------------------------------------
> > EGAWA Takashi
>
> > 2010年2月3日0:21 ma <coolw...@v001.vaio.ne.jp>:
> > > このグループから退会するには、android-sdk-ja...@googlegroups.com<android-sdk-j-apan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > > 詳細については、http://groups.google.com/group/android-sdk-japan?hl=jaからこのグループにアクセスしてください。
>
> > --
> > このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
> > このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
> > このグループから退会するには、android-sdk-ja...@googlegroups.com<android-sdk-j-apan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > 詳細については、http://groups.google.com/group/android-sdk-japan?hl=jaからこのグループにアクセスしてください。
>
> --
> Daisuke Miyakawa (宮川大輔)
> d.miyak...@gmail.com- 引用テキストを表示しない -
>
> - 引用テキストを表示 -
Applicationの継承クラスのインスタンスはコードで作る必要はありません。
JAVA アプリの main 相当とお考えください。
アプリが起動されてインスタンスが作成される順番は Application 、
次に以下のフィルタが付いた Activity となります。
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
つまり、Activity A が生成された時点で Application は生成済みです。
直ちに利用できます。
Applicationの継承クラスが
MyApplication.java
だと仮定します。
Activity からは
MyApplication app = (MyApplication) this.getApplication();
でアクセスできます。
その際、
AndroidManifest.xml を以下のようにします。
<application android:name="MyApplication" ... >
<activity android:name="ActivityA" ... >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="ActivityB" ...>
</activity>
<activity android:name="ActivityB" ...>
</activity>
このグループから退会するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。
いつも、ご教示ありがとうございます。
通常、Android プロジェクトを新規生成した際には、AndroidManifest.xml の<application> タグに
android:name="MyApplication" 属性が書かれていませんが、これを追記することによって、同一パッケージ内でアクセス可能
なアプリケーションが作られると考えてよろしいでしょうか?
この場合、ActivityA ~ ActivityCは、"MyApplication" (Application 拡張クラス') に属するメン
バのような感じに見えるのですが、MyApplication app = (MyApplication)
this.getApplication(); で受け取る参照は、自分自身の Application オブジェクトということになりますでしょう
か?
Activity [A], Activity [B], Activity [C] と、スレッドを実行する 'Application 拡張クラ
ス' は、Activity [A] ~ Activity [C] 自身のアプリケーションという認識でよろしいでしょうか?
以上、よろしくお願いいたします。
> > > >タスク、サービスについて、まだよく理解できておりませんが、サービスということは画面を持たずに、処理をバックグラウンドで走らすということになりますよね--?
>
> > > > イメージ的には、Activity [C] から、サービスを起動し、サービスの中からマルチスレッド処理を実行し、スレッドが終了した時点で
>
> > > Activity [A] に intent を送信するといった感じになるのでしょうか?
> > > イメージとしてはこの理解で正しいです。技術的には Intent
> > > オブジェクトではなく、共有しているデータベースやSharedPreferenceのデータなどに書き込むのではないかな、と。
> > > IntentはActivityを「起動」するイメージなので、今回のように Activity A
> > > に既に戻っていて、その状態で「スレッド」が終わったときにActivity Aに送るものとしては若干不適切かな、という感じがします。
>
> > > Activity
> > > を跨ぐ処理なのであればユーザには「今バックグラウンドで処理中です」と伝えた方が良いと思うので、個人的にはServiceかApplicationで独立起--動が良いかな、と思います。
> > > > > このグループから退会するには、android-sdk-ja...@googlegroups.com<android-sdk-j--apan%2Bunsu...@googlegroups.com>にメールを送信してください。
> > > > > 詳細については、http://groups.google.com/group/android-sdk-japan?hl=jaからこのグループにアクセスしてください。
>
> > > > --
> > > > このメールは Google
>
> ...
>
> もっと読む ≫- 引用テキストを表示しない -
>
> - 引用テキストを表示 -
皆様から、ご教示いただきました実装を入れたところ、意図した動作を実現することが出来ました。
実装は、Application の拡張クラスにて共有オブジェクトにアクセスすることにより、スレッド処理完了時にActivity [A] の画面
を更新することが出来ました。
本当に、助かりました^^
ありがとうございます。
> > > > >タスク、サービスについて、まだよく理解できておりませんが、サービスということは画面を持たずに、処理をバックグラウンドで走らすということになりますよね---?
>
> > > > > イメージ的には、Activity [C] から、サービスを起動し、サービスの中からマルチスレッド処理を実行し、スレッドが終了した時点で
>
> > > > Activity [A] に intent を送信するといった感じになるのでしょうか?
> > > > イメージとしてはこの理解で正しいです。技術的には Intent
> > > > オブジェクトではなく、共有しているデータベースやSharedPreferenceのデータなどに書き込むのではないかな、と。
> > > > IntentはActivityを「起動」するイメージなので、今回のように Activity A
> > > > に既に戻っていて、その状態で「スレッド」が終わったときにActivity Aに送るものとしては若干不適切かな、という感じがします。
>
> > > > Activity
> > > > を跨ぐ処理なのであればユーザには「今バックグラウンドで処理中です」と伝えた方が良いと思うので、個人的にはServiceかApplicationで独立起---動が良いかな、と思います。
今、質問を拝見しました。
コメントできなかったですが、うまくいったようですね。
スレッドのことはお詳しいようですから、
Activity の画面更新はちゃんと Handler を使ってらっしゃるかと思います。
> ...
>
> もっと読む ≫
江川です。解決されたようでよかったです。
もう不要かもしれませんが、御参考情報としてサービスで実装するサンプルを置きました。
http://www.grandnature.net/data/ServiceCallbackToActivity.zip
Eclipseのプロジェクトを圧縮していますので、ご覧になる際は展開してEclipseにそのままインポートして下さい。
Activity A->B->C と進み、Cでサービスに処理を依頼できます。
処理を依頼されたサービスは約5秒後に処理を終えて文字列を返します。
...もしサービスが文字列を返した時に、
・Aが表示されていれば、Aに表示されている文字列が変わります。
・A以外のもの(BやC)が表示されていれば、何も起こりません。
画面を閉じるボタンなどを作っていないので、C->Bなどのように画面を閉じていくのはbackキーでお願いします。
ではでは
------------------------------------------
EGAWA Takashi
2010年2月6日16:08 ma <cool...@v001.vaio.ne.jp>:
> --
> このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
> このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
サービスのサンプルありがとうございます。
サービスでの実装も考えていたので、是非参考にさせていただきます。
新たに問題が発生しております・・・。
Activity [A]
↓↑
Activity [B]
↓↑
Activity [C]
|
MyApplication
├ Thread 1
├ Thread 2
└ Thread 3
上記の処理に修正しておりますが、スレッドを実行しっぱなしで Activity [A] に戻った状態が長く続くと、長いスレッドが完了する前に、何
事も無かったかのように消えている場合があります。(多分修正前からの問題)
これは、Activity [C] が表示されない状態が長く続き、システムに Activity [C] が殺されちゃっていることに起因しているの
でしょうか?
スレッドを開始しているのは、MyApplication なのですが・・・
MyApplication で Activity [C] のコントロール等を参照していたりするとまずかったりするのでしょうか?
以上、よろしくお願いいたします。
On 2月8日, 午後7:29, egg <t.eg...@gmail.com> wrote:
> maさん
>
> 江川です。解決されたようでよかったです。
> もう不要かもしれませんが、御参考情報としてサービスで実装するサンプルを置きました。http://www.grandnature.net/data/ServiceCallbackToActivity.zip
> Eclipseのプロジェクトを圧縮していますので、ご覧になる際は展開してEclipseにそのままインポートして下さい。
>
> Activity A->B->C と進み、Cでサービスに処理を依頼できます。
> 処理を依頼されたサービスは約5秒後に処理を終えて文字列を返します。
> ...もしサービスが文字列を返した時に、
> ・Aが表示されていれば、Aに表示されている文字列が変わります。
> ・A以外のもの(BやC)が表示されていれば、何も起こりません。
> 画面を閉じるボタンなどを作っていないので、C->Bなどのように画面を閉じていくのはbackキーでお願いします。
>
> ではでは
> ------------------------------------------
> EGAWA Takashi
>
> 2010年2月6日16:08 ma <coolw...@v001.vaio.ne.jp>:
> >> > > > >タスク、サービスについて、まだよく理解できておりませんが、サービスということは画面を持たずに、処理をバックグラウンドで走らすということになりますよね----?
>
> >> > > > > イメージ的には、Activity [C] から、サービスを起動し、サービスの中からマルチスレッド処理を実行し、スレッドが終了した時点で
>
> >> > > > Activity [A] に intent を送信するといった感じになるのでしょうか?
> >> > > > イメージとしてはこの理解で正しいです。技術的には Intent
> >> > > > オブジェクトではなく、共有しているデータベースやSharedPreferenceのデータなどに書き込むのではないかな、と。
> >> > > > IntentはActivityを「起動」するイメージなので、今回のように Activity A
> >> > > > に既に戻っていて、その状態で「スレッド」が終わったときにActivity Aに送るものとしては若干不適切かな、という感じがします。
>
> >> > > > Activity
> >> > > > を跨ぐ処理なのであればユーザには「今バックグラウンドで処理中です」と伝えた方が良いと思うので、個人的にはServiceかApplicationで独立起----動が良いかな、と思います。
>
> >> > > > ご期待に添えれば幸いです。
>
> >> > > > 2010年2月3日6:22 egg <t.eg...@gmail.com>:
>
> >> > > > > maさん
>
> >> > > > > 江川です。
>
> >> > > > > みやかわさんがご提示された方法で、アクティビティCからAに簡単に戻すことができると思います。
> >> > > > > 処理が完了する前にCを閉じていることもあり得る場合は、ピーシークラフトさんが
> >> > > > > おっしゃる通りではないかと思います。アクティビティよりもライフサイクルが長い処理は、
> >> > > > > アクティビティでやらせない方がよいと思います。
>
> >> > > > > > イメージ的には、Activity [C] から、サービスを起動し、サービスの中からマルチスレッド処理を実行し、スレッドが終了した時点で
> >> > > > > > Activity [A] に intent を送信するといった感じになるのでしょうか?
>
> >> > > > > サービスを起動するのはどこでも構いませんし、マルチスレッドにしなくとも構いませんが
> >> > > > > アクティビティAを常に表示したい場合は上の方法で実現できると思います。
> >> > > > > 表示されているアクティビティによって振る舞いを変えたいときは
> >> > > > > サービスからアクティビティへコールバックし、アクティビティ側で
>
> これは、Activity [C] が表示されない状態が長く続き、システムに Activity [C] が殺されちゃっていることに起因しているの
> でしょうか?
そうだと思われます。
Application で Activity C にアクセスする際には必ず null チェックして、
null ならば startActivity で Activity C を起動します。
起動された Activity C は OnCreate 等で Application に自分自身を登録しておけば万事解決のはずです。
何にせよ Activity はその場で完結する処理と表示だけに専念させたほうが無用なトラブルは発生しないと思われます。
Service はバインドする時間が結構かかるので、他のアプリケーションへ機能を提供するとき以外は
使わないほうが良いかもしれません。
> ...
>
> もっと読む ≫
ご教示いただきましたとおり、 Activity [C] を Application オブジェクトに登録することで、現象を回避することが出来まし
た^^
今回痛切に感じましたが、Android ってライフサイクルの管理が難しいですね・・・
ありがとうございました。
> > > >> > > > >タスク、サービスについて、まだよく理解できておりませんが、サービスということは画面を持たずに、処理をバックグラウンドで走らすということになりますよね-----?