28

Main Activityメイン クラス( )内にブロードキャスト レシーバーを登録したアプリケーションを作成しましBroadcastReceiverMainActivity。レシーバーですべての値を受け取りましたが、それらを設定できませんでしたBroadcastReceiver

私の BroadcastReceiver クラスは、このような MainActivity の内部クラスです:-

public class MainActivity extends Activity {

   ..........

public static class NissanTabBroadcast extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            SharedPreferences shrd = context.getSharedPreferences("NissanGallery", context.MODE_WORLD_READABLE);
            type = shrd.getString("type", "null");
            badges = shrd.getString("badge_count", "null");

            //badge_tips_text.setText(badges);
            /*Editor edit =  shrd.edit();
            edit.remove("type");*/

            Toast.makeText(context, "" + type + "\n" + badge_tips_text.getText().toString(), Toast.LENGTH_LONG).show();
        }
    }
}

どんな助けもかなりのものになるでしょう

ありがとう

4

12 に答える 12

33

ハンドラーを使用することをお勧めします。

  1. アクティビティでハンドラーを初期化します。例:handler = new Handler()
  2. 上記のNissanTabBroadcastで行ったのと同じ方法で、コンストラクターでBroadcastReceiverにハンドラーを提供します。
  3. post()メソッドでHandlerインスタンスのメソッドを使用onReceive()して、UIを更新するRunnableを送信します

これは私が想像できる最もクリーンなソリューションです。

public class MainActivity extends Activity {

    private MyReceiver receiver;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        receiver = new MyReceiver(new Handler()); // Create the receiver
        registerReceiver(receiver, new IntentFilter("some.action")); // Register receiver

        sendBroadcast(new Intent("some.action")); // Send an example Intent
    }

    public static class MyReceiver extends BroadcastReceiver {

        private final Handler handler; // Handler used to execute code on the UI thread

        public MyReceiver(Handler handler) {
            this.handler = handler;
        }

        @Override
        public void onReceive(final Context context, Intent intent) {
            // Post the UI updating code to our Handler
            handler.post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(context, "Toast from broadcast receiver", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
}
于 2013-02-01T14:53:49.347 に答える
9

私の場合は、MainActivity によってホストされているフラグメントの 1 つでテキスト フィールドを更新することでした。私が見つけた最も簡単な解決策は次のとおりです。

私の MainActivity クラスでは、MainActivtiy の実行中のインスタンスを取得しました。これが私の MAinActivity です。

private static MainActivity mainActivityRunningInstance;
    public static MainActivity  getInstace(){
        return mainActivityRunningInstance;
    }
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mainActivityRunningInstance =this;
----------
}

ブロードキャスト レシーバーの onRecieve メソッドで、そのインスタンスを取得し、update メソッドを呼び出します。

 @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().matches(Intents.PROVIDER_CHANGED_ACTION)) {
                String textValue="the text field value";
// the null check is for, if the activity is not running or in paused state, in my case the update was required onlyif the main activity is active or paused
            if(MainActivity.getInstace()!=null)
                MainActivity.getInstace().updateUI(textValue);
}

UIThread で更新を実行する必要がある部分については、MainActivity の updateUI メソッドが Fragments update メソッドを呼び出します。

  public void updateUI(final String str) {
        MainActivity.this.runOnUiThread(new Runnable() {
            public void run() {
     //use findFragmentById for fragments defined in XML ((SimpleFragment)getSupportFragmentManager().findFragmentByTag(fragmentTag)).updateUI(str);
            }
        });
    }

最後のステップは、フラグメントのテキスト フィールドを更新することです

public void updateUI(String str){
        tv_content.setText(str);
    }

そしてビンゴ、完成です。このリンクを参照して問題を解決しました。それが他の人を助けることを願っています。

于 2015-08-14T02:22:47.953 に答える
6

使用runOnUiThread:

 MainActivity.this.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            // show alert

        }
    });
于 2013-02-01T09:43:13.097 に答える
1

私の場合、アクティビティのテキストビューを着信 sms で更新したいのですが、putextra を使用して必要な情報を追加し、ブロードキャスト レシーバーからアクティビティを開始しました。

Intent intentone = new Intent(context.getApplicationContext(), enroll.class);
intentone.putExtra("pinbody",message);
intentone.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intentone);    

そして、受信側、つまり登録アクティビティで、以下を使用してその情報を抽出し、テキストビューを更新しました。

Bundle extras = getIntent().getExtras();
String message = extras.getString("pinbody");

それが役立つかどうかはわかりませんが、間違いなくあなたが望むものにつながるでしょう.

乾杯 !

于 2015-06-13T20:17:18.933 に答える
0

Handler とその post() メソッドを使用しました。runOnUiThread() の代わりに。Context を Activity にキャストする必要はありません。runOnUiThread() の代替

Handler handler = new Handler();
Runnable runnable = new Runnable() {
    private long startTime = System.currentTimeMillis();
    public void run() {
        while (gameState == GameState.Playing) {  
            try {
                Thread.sleep(1000);
            }    
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            handler.post(new Runnable(){
                public void run() {
                   tvTime.setText("" + ((System.currentTimeMillis() - this.startTime) / 1000));
            }
        });
        }
    }
};
new Thread(runnable).start();
于 2015-02-26T11:45:55.667 に答える
0

ブロードキャスト レシーバーを内部クラスとして作成する必要があります。これにより、UI を更新するためにすべてのフィールドにアクセスできるようになります。

nick butcher によるこの Plaid アプリを参照 Plaid- Nick Butcher(Github)

于 2017-03-01T11:16:49.247 に答える
0

BroadcastReceiver の onReceive() メソッドはメイン スレッドで実行されるため、このメソッドで UI を変更できます。また、メイン スレッドで実行される onReceive() と同様に、ここから長時間実行される操作を実行しないでください。

公式ドキュメントから:

レシーバーの onReceive(Context, Intent) メソッドはメイン スレッドで実行されるため、実行してすぐに戻る必要があります。長時間実行する作業を実行する必要がある場合は、 onReceive() が返された後にシステムがプロセス全体を強制終了する可能性があるため、スレッドの生成またはバックグラウンド サービスの開始に注意してください。詳細については、プロセス状態への影響を参照してください。長時間実行される作業を実行するには、次のことをお勧めします。

レシーバーの onReceive() メソッドで goAsync() を呼び出し、BroadcastReceiver.PendingResult をバックグラウンド スレッドに渡します。これにより、onReceive() から戻った後もブロードキャストがアクティブなままになります。ただし、このアプローチでも、システムはブロードキャストを非常に迅速に (10 秒未満で) 終了することを期待しています。メインスレッドの不具合を回避するために、作業を別のスレッドに移動することができます。JobScheduler を使用したジョブのスケジューリング。詳細については、インテリジェント ジョブ スケジューリングを参照してください。

于 2020-01-04T07:47:08.287 に答える