1

私はアンドロイド開発を学び始めているので、現時点では私の知識は本当に限られています。ブロードキャストで遊んでみましたが、行き詰まり、何が間違っているのか理解できません。私がやろうとしているのは、放送受信機からの単純なトーストを表示することです。

Intent は、マニフェストで定義されたカスタム インテントです。

<receiver android:name=".receiver.SendReceiver" android:enabled="true">
     <intent-filter>
   <action android:name="com.android.terralink.sem.SOCCIA"></action>
     </intent-filter>
</receiver>

レシーバーは次のように定義されます。

public class SearchReceiver extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent){
   Toast.makeText(context, "asasa", Toast.LENGTH_SHORT).show();
   }
}

アプリケーションから呼び出される最初のアクションで、次のようにします。

Intent i2 = new Intent(this, SearchReceiver.class);
i2.setAction(CUSTOM_INTENT);
sendBroadcast(i2);

Toast コードがアクティビティで動作することを確認しましたが、ブロードキャストでは動作しません。Toast を受信者のコンテキストで表示できないためですか?

また、Android アプリケーションの構造に関する別の質問。Activty から、ユーザーがテキスト ボックスに文字列を挿入して送信できるようにし (ボタン バインド)、アプリケーションがバックグラウンドで検索を実行し、結果が準備できたらユーザーに通知するようにしたい場合、次の手順は正しいですか? 1) 検索ボックス付きのメイン アクティビティ 2) データを取得するサービスを開始し、ブロードキャストを送信する 3) 受信者がユーザーに通知し、結果を表示するアクティビティを開く

そんなことして意味あるの?または、ジョブを終了する前に、サービス自体によって通知を行う必要がありますか?

ありがとう

4

3 に答える 3

2

受信者を登録したときに、マニフェストに問題があることがわかりました。実際、問題なく受信機にトーストを表示することができます。乾杯

于 2010-09-23T00:17:42.973 に答える
0

ブロードキャスト レシーバーでトーストを表示することはできません。Android は通常、onReceive() 呼び出しが完了するとプロセスをシャットダウンします (現時点では最大 10 秒しかかかりません)。トーストは非同期で表示されるため、表示される前にそのコンテキストが殺されていると思います。

Toast の代わりに、レシーバーから別のプロセスで UI を更新するための RemoveViews の概念を見ることができます。または、トーストを表示してすぐに閉じるアクティビティを起動します。

質問 2 については、検索ボタンがクリックされた後もアクティビティを実行し続け、検索の AsyncTask を開始することをお勧めします。これにより、検索結果が表示されるたびに更新されます。

于 2010-09-20T11:29:42.097 に答える
0

ブロードキャスト レシーバーからトーストを表示するには、次のコードを使用できます。

public class ServiceReceiver extends BroadcastReceiver {

    Context context;

    @Override
    public void onReceive(Context context, Intent intent) {
        this.context = context;
        MyPhoneStateListener phoneListener = new MyPhoneStateListener();
        TelephonyManager telephony = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
    }

    private class MyPhoneStateListener extends PhoneStateListener {

        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:
                Toast.makeText(context, "Idle call", Toast.LENGTH_LONG).show();
                Log.d("***************************DEBUG", "IDLE");
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                Log.d("***************************DEBUG", "OFFHOOK");
                break;
            case TelephonyManager.CALL_STATE_RINGING:
                Toast.makeText(context, "Ringing call", Toast.LENGTH_LONG)
                        .show();
                Log.d("***************************DEBUG", "RINGING");
                break;
            }
        }
    }
}
于 2011-08-29T11:16:43.420 に答える