Как передать данные из сервиса в BroadcastReceiver в Android через Intent - PullRequest
3 голосов
/ 17 апреля 2011

Я пытаюсь вызвать BroadcastReceiver из службы через намерение.

В моем сервисном файле я вызываю BroadcastReceiver следующим образом:

    final Handler handler = new Handler();   
    final Runnable r = new Runnable()     {     
    public void run()                  {    

                // code here what ever is required  
                System.out.println("Runnnn");
                counter++;

                Intent i = new Intent();
                i.setAction("Refresh");
                Bundle b = new Bundle();
                b.putInt("Counter", counter);
                i.putExtra("Bundle", b);
                ctx.sendBroadcast(i);

                handler.postDelayed(this, 1000);     


                Toast.makeText(getApplicationContext(), "counter"+counter, Toast.LENGTH_LONG).show();



                }    

          };     
          handler.postDelayed(r, 1000);


onReceive() в BroadcastReceiver выглядит следующим образом:

public void onReceive(Context context, Intent arg1) {
    System.out.println("OnReceiveeeeee");

    if(arg1.getAction().equalsIgnoreCase("Refresh"))
    {
        System.out.println("Received Intent");
        Bundle b = arg1.getExtras();
        c=b.getInt("Counter");
        System.out.println("Counter in Receiver:::"+c);
    }
}


Но я получаю значение в onReceive как ноль.
Любая помощь приветствуется для получения правильного значения в методе onReceive ().
будет ждать ответа.

Ответы [ 2 ]

1 голос
/ 17 апреля 2011

Вы осуществляете неправильный доступ.

Bundle b = arg1.getExtras();

Вам необходимо получить доступ следующим образом.

Bundle b = intent.getBundleExtra("Bundle");

================================================

Вы также можете написать свой код без использования bundle:

В службе

i.putExtra("Counter", counter);

В BroadcastReceiver

intent.getIntExtra("Counter", -1); // -1 is defalut value
1 голос
/ 17 апреля 2011

вот фрагменты кода, который я использую для трансляции выхода из системы для запроса всех моих приложений. Действия, закрывающиеся при возврате к экрану входа в систему

logoutBroadcastReceiver lbr;

@Override
public void onResume(){ 
...
// register the broadcast receiver
IntentFilter intentfilter = new IntentFilter("com.on3x.action.DO_LOGOUT");
lbr = new logoutBroadcastReceiver();
registerReceiver(lbr,intentfilter);
super.onResume();
...
}

// broadcast receiver grabbing the "test" bundled extra
    public class logoutBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(getString(R.string.app_name), "broadcast string: " + intent.getStringExtra("string_example"));
            Log.d(getString(R.string.app_name), "extra!: " + intent.getIntExtra("int_example",0));

            finish();
        }
    }   


// broadcast the intent to logout when logout button clicked
// put the extra "test" in the bundle
    public void onClickLogout(View _view) {
        Intent i = new Intent("com.on3x.action.DO_LOGOUT");
        i.putExtra("string_example", "here is a broadcasted string");
        i.putExtra("int_example", 100);
        sendBroadcast(i);
    }

Надеюсь, этот код поможет вам в работе?

Редактировать: обновлено для использования putExtra() и getStringExtra()/getIntExtra()

...