Service等からのActivityの起動

6,203 views
Skip to first unread message

mfright

unread,
Jul 27, 2010, 7:42:35 AM7/27/10
to 日本Androidの会
Androidアプリで,アクティビティを起動したいです.

学生の者です.Androidでアプリを作成しています.サービスまたはスレッドからActivityを呼び出す方法が分からず,お知恵をお借りしたく
存じます.


バックグラウンドでBluetoothデバイスを定期的にサーチしたいため,Serviceクラスを継承したクラスを実行しています.
このサービスからActivityを継承したクラスを以下のように呼び出そうとすると,端末で「~が予期せず終了しました」と表示されうまくいきませ
ん.

Intent i = new Intent(getApplicationContext(),BluetoothChat.class);
startActivity(i);

ちなみに,ServiceではなくActivityを継承したクラスでこれを実行してもエラーにはなりませんでした.webで調べてみましたが,これに
関する記述を見つけられませんでした.
ServiceかThreadなどから,Activityを起動する方法をご存知ないでしょうか.

android公式ページで紹介されているBluetoothChatというサンプルを使い回していますが,BroadcastReceiverという
オブジェクトをregisterReceiver()するところで,「サービスにはこのメソッドは存在しないよ」とEclipseに怒られるため,やむ
なくActivityを「隠す」処理でごまかしたいと考えています.

ご意見お願い申し上げます.

ohisamallc

unread,
Jul 27, 2010, 9:42:28 PM7/27/10
to android-g...@googlegroups.com
山形のohisamaです。
山形は、暑いです。

基本、activityは呼べないです。toastとnotificationで通知は
できるはずです。音も大丈夫かな。

どうしてもなら、alarmmanager使いましょう。
自分は、勝手に動くアプリは、いやです。

> -----Original Message-----
> From: android-g...@googlegroups.com
> [mailto:android-g...@googlegroups.com]On Behalf Of mfright
> Sent: Tuesday, July 27, 2010 8:43 PM
> To: 日本Androidの会
> Subject: [work] [android-group-japan: 5706] Service等からのActivityの起
> 動
>
>
> Androidアプリで,アクティビティを起動したいです.
>
> 学生の者です.Androidでアプリを作成しています.サービスまたはスレッドから
> Activityを呼び出す方法が分からず,お知恵をお借りしたく
> 存じます.
>
>
> バックグラウンドでBluetoothデバイスを定期的にサーチしたいため,Serviceクラ
> スを継承したクラスを実行しています.


> このサービスからActivityを継承したクラスを以下のように呼び出そうとすると,
> 端末で「~が予期せず終了しました」と表示されうまくいきませ
> ん.
>
> Intent i = new Intent(getApplicationContext(),BluetoothChat.class);
> startActivity(i);
>
> ちなみに,ServiceではなくActivityを継承したクラスでこれを実行してもエラー

> はなりませんでした.webで調べてみましたが,これに
> 関する記述を見つけられませんでした.
> ServiceかThreadなどから,Activityを起動する方法をご存知ないでしょうか.
>
> android公式ページで紹介されているBluetoothChatというサンプルを使い回してい
> ますが,BroadcastReceiverという
> オブジェクトをregisterReceiver()するところで,「サービスにはこのメソッドは
> 存在しないよ」とEclipseに怒られるため,やむ
> なくActivityを「隠す」処理でごまかしたいと考えています.
>
> ご意見お願い申し上げます.
>

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られ

> います。
> このグループに投稿するには、android-g...@googlegroups.com にメール

> 送信してください。
> このグループから退会するには、
> android-group-j...@googlegroups.com にメールを送信してくださ

> 。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja

> らこのグループにアクセスしてください。
>
>
>

egg

unread,
Jul 28, 2010, 3:37:59 AM7/28/10
to android-g...@googlegroups.com
江川と申します。
FLAG_NEW_TASKでstartActivityすればServiceからActivityを起動することは可能です。
ただ、ohisamaさんがおっしゃるとおり、あまりそういうことはしません。ユーザーが端末を使って何かの作業やゲームをしている最中かもしれないのに、意図しないタイミングでいきなり画面が出てしまうと、ユーザー体験的にはあまりよくないからです。
察するに、Activityを「隠す」とおっしゃっているので、Activityを起動することが目的ではないのではないでしょうか。もう少し詳しく教えて頂ければいいアドバイスが貰えるかもしれません。

------------------------------------------
EGAWA Takashi

2010/7/27 mfright <mfr...@gmail.com>:

mfright

unread,
Jul 28, 2010, 9:15:52 AM7/28/10
to 日本Androidの会
ohisama様
android.app.AlarmManagerにつきましてお教え頂き,誠にありがとうございます.
調べてみましたところ,周期的に処理を呼び出す手法としてとても便利な機能であると思いました.

ソフトへの適用を考えてみます.ありがとうございます.

> 山形は、暑いです。
私の学校でも熱中症対策を頻繁に呼びかけられております.何卒ご自愛ください.


On 7月28日, 午前10:42, "ohisamallc" <peng...@mui.biglobe.ne.jp> wrote:
> 山形のohisamaです。

mfright

unread,
Jul 28, 2010, 10:09:34 AM7/28/10
to 日本Androidの会
江川様
FLAG_NEW_TASKにつきましてお教え頂き,ありがとうございます.

> ただ、ohisamaさんがおっしゃるとおり、あまりそういうことはしません。
おっしゃる通りに思います.決してアクティビティを表示させたい訳ではないのですが,BroadcastReceiverを使うためやむなく
Activityを継承したクラス(あるいはBroadcastReceiverを使えるクラス)を呼び出そうとしております.

恥ずかしながら,経緯としましては...
1. サンプルソースのBluetoothChatを参考に,周期的に周囲のBluetoothデバイスをサーチするServiceを作ろうとし
た.
2. BluetoothChatでは,Activityの中でContextWrapper.registerReceiver()メソッドを使い
「デバイスを発見した」ときの処理が「登録」されていた.
3. そのコードをそのまま,Serviceが定期的に呼び出すThreadで使おうと引用したら,
「ContextWrapper.registerReceiverはThreadでは使えない」とEclipseに怒られた.
4. 仕方なく,Activityはそのままにし,ServiceからThreadを呼び出し,そのThreadから定期的にActivityを呼び
出すことにした.
となっております.

急造品なソフトで,ohisama様のおっしゃる通り,あまり正しくない方法を取っていることは存じ上げております.
ただ現状,ThreadではContextWrapper.registerReceiver()は使用できないようなので,無理矢理Activity
を呼び出し,ユーザ操作の妨げにならないようsetVisible(false)によって「隠して」おります.

FLAG_NEW_TASK定数につきまして勉強致し,試行してみたいと存じます.
ありがとうございます.

On 7月28日, 午後4:37, egg <t.eg...@gmail.com> wrote:
> 江川と申します。
> FLAG_NEW_TASKでstartActivityすればServiceからActivityを起動することは可能です。
> ただ、ohisamaさんがおっしゃるとおり、あまりそういうことはしません。ユーザーが端末を使って何かの作業やゲームをしている最中かもしれないのに、意図 しないタイミングでいきなり画面が出てしまうと、ユーザー体験的にはあまりよくないからです。
> 察するに、Activityを「隠す」とおっしゃっているので、Activityを起動することが目的ではないのではないでしょうか。もう少し詳しく教えて頂け ればいいアドバイスが貰えるかもしれません。
>
> ------------------------------------------
> EGAWA Takashi
>
> 2010/7/27 mfright <mfri...@gmail.com>:

egg

unread,
Jul 28, 2010, 10:58:47 AM7/28/10
to android-g...@googlegroups.com
mfrightさん

江川です。お返事ありがとうございます。

> FLAG_NEW_TASK定数につきまして勉強致し,試行してみたいと存じます.

説明不足で申し訳ありません。Intent#setFlagメソッドで上記定数を設定する感じです。

> BroadcastReceiverを使うためやむなく
> Activityを継承したクラス(あるいはBroadcastReceiverを使えるクラス)を呼び出そうとしております.

Activityと同じくServiceもContextWrapper(のサブクラス)ですので、
ServiceもregisterReceiverメソッドを持っています。なので、BroadcastReceiverを使うことができます。
それでは何か問題がありますでしょうか?

------------------------------------------
EGAWA Takashi

2010/7/28 mfright <mfr...@gmail.com>:

mfright

unread,
Jul 29, 2010, 11:45:01 AM7/29/10
to 日本Androidの会
江川様

ご説明頂きました通り,FLAG_NEW_TASKをintentにsetすることで,Activityを起動する事ができました!!!
具体的には,
Intent i = new
Intent(getApplicationContext(),DeviceListActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
でActivityを起動できました.

また,ServiceのクラスでもBroadcastReceiverが使用できました.
今後,ActivityではなくServiceでなんとか処理できるように改良していきたいと思います.

本当にありがとうございます!

On 7月28日, 午後11:58, egg <t.eg...@gmail.com> wrote:
> mfrightさん
>
> 江川です。お返事ありがとうございます。
>
> > FLAG_NEW_TASK定数につきまして勉強致し,試行してみたいと存じます.
>
> 説明不足で申し訳ありません。Intent#setFlagメソッドで上記定数を設定する感じです。
>
> > BroadcastReceiverを使うためやむなく
> > Activityを継承したクラス(あるいはBroadcastReceiverを使えるクラス)を呼び出そうとしております.
>
> Activityと同じくServiceもContextWrapper(のサブクラス)ですので、
> ServiceもregisterReceiverメソッドを持っています。なので、BroadcastReceiverを使うことができます。
> それでは何か問題がありますでしょうか?
>
> ------------------------------------------
> EGAWA Takashi
>
> 2010/7/28 mfright <mfri...@gmail.com>:

Lewske Wada

unread,
Jul 27, 2010, 11:12:05 AM7/27/10
to android-g...@googlegroups.com
mfright wrote :
> このサービスからActivityを継承したクラスを以下のように呼び出そうとすると,端末で「~が予期せず終了しました」と表示されうまくいきません.

>
> Intent i = new Intent(getApplicationContext(),BluetoothChat.class);
> startActivity(i);
>
> ServiceかThreadなどから,Activityを起動する方法をご存知ないでしょうか.
>

はんどらつかって,
GUI スレッドからやってみたらは?

Cheers,
Lewske "Ryu" Wada
Web: http://run.sh/
Email: r...@run.sh
ICQ: 348990359

Reply all
Reply to author
Forward
0 new messages