あるActivityからBroadcastReceiverを手動で起動するには

1,169 views
Skip to first unread message

aki

unread,
Jul 22, 2013, 9:42:03 AM7/22/13
to android-g...@googlegroups.com
お世話になっております、akiです。

件名について、はまってしまい、糸口がつかめないので質問させていただきます。

今、とあるActiviryのjavaから、BroadcastReceiver内にあるメソッド(?)を起動しようと
しています。

通常BroadcastReceiverは端末の状態変化をキャッチして内部のロジックが起動する。という
動きをする認識ですが、今はまっており、実現したいことは、例えばユーザがなにかのアクションを
した場合にBroadcastReceiver内にあるメソッドが起動したことにできないかな。という点です。

BroadcastReceiver周りの情報を調べて、試してみましたが、なかなか動作しません。

ちなみに呼び元のほうのjavaは「onReceive」のタイミングとします。(ログではここにきていることを確認しています)
呼び元のonReceiveからBroadcastReceiverを起動するにはどうすればいいのでしょうか。。

お手数をおかけしますが、どうぞよろしくお願い致します。

awwa

unread,
Jul 22, 2013, 11:03:32 AM7/22/13
to android-g...@googlegroups.com

あわと申します。

質問内容はActivity継承のクラスからBroadcastReceiver継承のクラス内の処理の呼び出しをしたいという風に読み取りました。
単純に言葉通り取ると、呼び出したい処理をpublic staticなものにすればよいのではないでしょうか?
ユーザからのアクション時もonReceive()からも同じ処理を呼び出すことにすれば良いと思います。
ただし、時間のかかる処理の呼び出しは注意が必要ですが。

あとたぶん、「BroadcastReceiverを起動する」という表現は適切ではないと思います。一般的にはBroadcastReceiverは予めregisterreceiverされたIntentを受け取るだけです。「起動する」というのがregiterreceiverすることを意味しているのであればregisterreceiver後にintentをbroadcastすればよいはずです。

では。

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

aki

unread,
Jul 22, 2013, 10:03:48 PM7/22/13
to android-g...@googlegroups.com
あわ様

ご連絡ありがとうございました!

実際にコーディングしているソースを整理して考えてみました。
やりたいことは2ファイルにまたがっているので、整理すると下記のようになります。

A.java側で①の処理が通るタイミングがあり、そのタイミングでB.javaの②の箇所に
値などを渡したいと考えています。

************************************************************************************************
■A.java

public class AAA extends AppWidgetProvider {

    public void onReceive(Context c, Intent intent) {
        //①ここで端末操作により、処理が走るタイミングがあるので
        //BBBに値を渡したい
       
    }
}


■B.java

public class BBB extends BroadcastReceiver {

    public void onReceive(Context c, Intent intent) {
        //②ここにAAAの状態(フラグ等の値)を受け取りたい
       
        //受け取った処理により、動作を変えたい。
       
    }
}
************************************************************************************************

当初、Intentをnewして値をBBB.javaに送ることができるのかなと思い、やってみましたが
実現できませんでした。

//やってみたこと---------------------------------------------
Intent intent2 = new Intent(c, BBB.class);
c.startService(intent2);
c.sendBroadcast(intent2);
//やってみたこと---------------------------------------------

B.javaのBroadcastReceiverのonReceiveの直下にログを出力してみましたが、
処理自体は動いているようでした。


うまく伝えられなくて申し訳ありませんが、上記のような現象になっています。
どうぞよろしくお願い致します。







2013年7月23日火曜日 0時03分32秒 UTC+9 awwa:

あわと申します。

質問内容はActivity継承のクラスからBroadcastReceiver継承のクラス内の処理の呼び出しをしたいという風に読み取りました。
単純に言葉通り取ると、呼び出したい処理をpublic staticなものにすればよいのではないでしょうか?
ユーザからのアクション時もonReceive()からも同じ処理を呼び出すことにすれば良いと思います。
ただし、時間のかかる処理の呼び出しは注意が必要ですが。

あとたぶん、「BroadcastReceiverを起動する」という表現は適切ではないと思います。一般的にはBroadcastReceiverは予めregisterreceiverされたIntentを受け取るだけです。「起動する」というのがregiterreceiverすることを意味しているのであればregisterreceiver後にintentをbroadcastすればよいはずです。

では。

On Jul 22, 2013 10:42 PM, "aki" <devk...@gmail.com> wrote:
お世話になっております、akiです。

件名について、はまってしまい、糸口がつかめないので質問させていただきます。

今、とあるActiviryのjavaから、BroadcastReceiver内にあるメソッド(?)を起動しようと
しています。

通常BroadcastReceiverは端末の状態変化をキャッチして内部のロジックが起動する。という
動きをする認識ですが、今はまっており、実現したいことは、例えばユーザがなにかのアクションを
した場合にBroadcastReceiver内にあるメソッドが起動したことにできないかな。という点です。

BroadcastReceiver周りの情報を調べて、試してみましたが、なかなか動作しません。

ちなみに呼び元のほうのjavaは「onReceive」のタイミングとします。(ログではここにきていることを確認しています)
呼び元のonReceiveからBroadcastReceiverを起動するにはどうすればいいのでしょうか。。

お手数をおかけしますが、どうぞよろしくお願い致します。

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

aki

unread,
Jul 22, 2013, 10:31:35 PM7/22/13
to android-g...@googlegroups.com
あわ様

おせわになっておりますakiです。

すみません、自分で返答したメールの内容が質問と大きくかけ離れていました。

上記のような方法をはじめ試していたのですが、うまく値を渡せずにいたため、
A.java内にあるBroadcastReceiverを起動しようとしていました。

--------------------------------------------------------------------------------
    //ブロードキャストレシーバーを継承した、抽象クラス
    public static BroadcastReceiver AAAReceiver = new BroadcastReceiver() {

        //onReceive( )というメソッドは、
        //サービスからブロードキャストされたIntentを受け取った際に呼び出されるコールバックメソッド
        @Override
        public void onReceive(Context c, Intent in) {
            //③これを起動したい
        }
   }
--------------------------------------------------------------------------------

ですので、「A.javaの①のところで、AAAReceiverのonReceive(③のところ)を起動させたい」という
ところでハマっております。

BroadcastReceiverについては色々と調べている最中ですが、なかなか解決に至っていません。
どうぞよろしくお願い致します。






2013年7月23日火曜日 11時03分48秒 UTC+9 aki:
            このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
            このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。

Sosuke Masui

unread,
Jul 23, 2013, 6:37:55 AM7/23/13
to android-g...@googlegroups.com
 BBBで受け取りたい"AAAの状態(フラグ等の値)"が何を指しているのか判然としないのですが、以下のいずれかでしょうか?


1. AAAが管理する何らかの値
2. AAA.onReceive()のIntentパラメータに格納された値


(1)、(2)のいずれかであろうと仮定すると、あなたが当初やろうとしていたIntentをnewして値をBBB.javaに送るのは以下のような方法で実現できます。



(1)の場合は、Intent.putExtra()メソッドでIntentに値を設定できます。

public class AAA extends AppWidgetProvider {

    @Override
    public void onReceive(Context context, Intent intent) {

        //やってみたこと---------------------------------------------

        Intent intent2 = new Intent(context, BBB.class);

        //Intentにデータを追加する
        intent2.putExtra("Foo", "Bar");

        //この呼出しでBBBは呼ばれていると仮定する
        context.sendBroadcast(intent2);
        //やってみたこと---------------------------------------------

        super.onReceive(context, intent);
    }
}



(2)の場合はIntent.fillIn()メソッドなどで元のIntentのデータをコピーできます。

public class AAA extends AppWidgetProvider {

    @Override
    public void onReceive(Context context, Intent intent) {

        //やってみたこと---------------------------------------------

        Intent intent2 = new Intent(context, BBB.class);

        // BBB.javaの投稿者のコメント"ここにAAAの状態(フラグ等の値)を受け取りたい"がIntentのExtraだと仮定して、Extraをコピーする
        intent2.fillIn(intent, Intent.FILL_IN_DATA);

        //この呼出しでBBBは呼ばれていると仮定する
        context.sendBroadcast(intent2);
        //やってみたこと---------------------------------------------

        super.onReceive(context, intent);
    }
}




2013年7月23日火曜日 11時31分35秒 UTC+9 aki:
            このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
            このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

ネギシ タク

unread,
Jul 23, 2013, 8:35:11 AM7/23/13
to android-g...@googlegroups.com

グローバル変数を使うのはいかがでしょうか。
「android globals 変数」で検索をすると情報があるので、もしよろしければ参考にしてみてください。

2013/07/23 19:38 "Sosuke Masui" <esm...@gmail.com>:
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。

aki

unread,
Jul 23, 2013, 9:15:51 PM7/23/13
to android-g...@googlegroups.com
Sosukeさま、TaQooさま

おせわになっております、akiです。

解決方法について、ご助言ありがとうございました。
その後、色々と試してみたところ、なんとか解決できました。

■試したこと
・intent経由での値の受け渡し
・グローバル変数でB.javaに値を渡す
・B.javaの機能をnewして利用してるC.javaのメソッドを呼んでみる

結果的に上記のどれもダメでした・・・。

本来やりたかったことは、端末の状態が変わった時、A.java内での
(BroadCastRecier内の)命令を起動したかったのですが、
それがB.java内にあり、そこに対してなんとかパラメータや、起動の
タイミングを送りたかったことです。

ですが、どの方法もうまくいかず途方に暮れていたところ、
A.java内で状態変化があった時(onReceive)に、自分自身A.javaの
onUpdateを呼び出すことで、改めてA.javaとB.javaに関連する処理が
動いて、目的の動作になることがわかりました!

各activiryの深い部分は勉強しないといけませんが、まずはこれで
問題解決としようと思います。

より深い部分を理解したうえで作れるよう、当groupで勉強させていただきます。
ありがとうございました。





2013年7月23日火曜日 21時35分11秒 UTC+9 TaQoo:
 BBBで受け取りたい"AAAの状態(フラグ等の値)"が何を指しているのか判然としないのですが、以下のいずれかでしょうか?


2013年7月23日火曜日 11時31分35秒 UTC+9 aki:
            このグループに投稿するには、android-group-jap...@googlegroups.com にメールを送信してください。

            http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
            その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
             
              

Reply all
Reply to author
Forward
0 new messages