【问题标题】:Sending Extra Message between Service and BroadcastReceiver在 Service 和 BroadcastReceiver 之间发送额外的消息
【发布时间】:2013-11-21 16:56:48
【问题描述】:

在我的应用程序中,我有 TextField 和按钮。单击时,Service 启动并从 TextField 读取值并触发 AlarmManager。几秒钟后服务启动BroadcastReceiverBrodcastReceiver 启动第二个Activity

Activity 通知服务并发送值。我可以在Service 中看到具有正确编号的Toast。但在 Second Activity 中,我只看到第一次输入的值。

例如:我写了 5,它计数到 5,然后启动 BroadcatsReceiver,在 Activity 中我可以看到 5。但是如果我现在输入 3,它会计数到 3,但在第二个活动中显示 5(示例下图)。 Next:我把 8 数到 8,先正确显示 Toast。在Second活动中仍然: 5.即使我将再次在手机上上传程序。查看正确值的唯一方法是删除应用程序并再次启动它。我该如何解决?

MainActivity 中的方法:

public void ClickStart(View view) {
        Intent i = new Intent(this, MyService.class);
        EditText numerField = (EditText) findViewById(R.id.numerField);
        String message = numerField.getText().toString();
        i.putExtra("EXTRA_MESSAGE", message);
        this.startService(i);
    }

我的服务:

public class MyService extends Service {
    @Override
    public void onStart(Intent intent, int startId) {

        int countTime = 10;
        String data = (String) intent.getExtras().get("EXTRA_MESSAGE");
       countTime = Integer.parseInt(data);

        Intent i = new Intent(this, MyReciver.class);
        i.putExtra("EXTRA_MESSAGE", data);
        Log.d("dddService", data);  // Correct data

        Toast tosty = Toast.makeText(this, data + " sec", Toast.LENGTH_SHORT);
        tosty.show();           

        PendingIntent pintent = PendingIntent.getBroadcast(
                this.getApplicationContext(), 1, i, 0);

        AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()
                + (countTime * 1000), pintent);

    }

我的接收者:

public void onReceive(Context arg0, Intent arg1) {


        String data = (String) arg1.getExtras().get("EXTRA_MESSAGE");
        Log.d("ddd", data);  //wrrong data
        Intent i = new Intent(arg0, MyActivity.class);
        i.putExtras(arg1.getExtras());
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        arg0.startActivity(i);  
    }

我的活动:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String message = getIntent().getStringExtra("EXTRA_MESSAGE");

        Toast.makeText(getApplicationContext(), message + " Activity", Toast.LENGTH_SHORT)
                .show();

    }

【问题讨论】:

  • 你是想实现一个计数器,还是?我怀疑你做的事情比需要的复杂,所以想知道你的代码的目标。
  • 这是实验室练习。使用输入字段和按钮创建活动 A 按下按钮时,活动 A 应该启动服务。服务使用 AlarmManager 设置警报。必须在活动 A 的输入字段中指定的秒数后触发警报。触发警报时,必须通知广播接收器。 BroadcastReceiver收到通知后,必须启动Activity B。

标签: android data-binding service broadcastreceiver


【解决方案1】:

好的,假设您希望从活动 A 移动到 B

1:在A中注册一个BroadcastReceiver

// declare a field variable for the BroadcastReceiver
private BroadcastReceiver startActivityB;
// inside onCreate
startActivityB = new StartActivityB();
registerReceiver(startActivityB, new IntentFilter("INTENT_WAKEUP_B");

// inside onDestroy
unregisterReceiver(startActivityB);

// implementation of startActivityB as a private class inside A
private class StartActivityB extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent arg1) {

        String data = (String) arg1.getStringExtra("EXTRA_MESSAGE");
        Log.d("ddd", data); 
        Intent i = new Intent(arg0, MyActivity.class);
        i.putExtras(arg1.getExtras());
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        startActivity(i);  
    }
}

2:像你已经做的那样读取 TextView 值:

final String message = intent.getStringExtra("EXTRA_MESSAGE");

3:例如解析为数字

int timeToWait = Integer.parseInt(message);

4:使用延迟处理程序等待并启动活动 B

    new Handler().postDelayed(new Runnable() {

        public void run() {
            Intent intent = new Intent("INTENT_WAKEUP_B");
                            intent.putExtra("EXTRA_MESSAGE",message);
                            sendBroadcast(intent);
        }
    }, timeToWait * 1000); // * 1000 if timeToWait is in seconds 

5:在活动 B 中通过覆盖 onNewIntent 获取消息

@Override
protected void onNewIntent(Intent intent) {
    String message = intent.getStringExtra("EXTRA_MESSAGE");


    Toast.makeText(getApplicationContext(), message + " Activity", Toast.LENGTH_SHORT)
            .show();
    super.onNewIntent(intent);
}

【讨论】:

  • 我的错误,在我解析的代码中:countTime = Integer.parseInt(data);在服务中。我只是错过了粘贴代码。计数效果很好。问题是如何在第二个活动中显示文本字段中的值。
  • 答案现在包括广播接收器
  • 好吧,还有一个问题。在程序中我必须使用 AlarmManager 而不是延迟处理程序。当我使用你的方式时它可以工作,但是当我用 AlarmManager 替换它时 - 数字仍然不正确。但如果我要添加:sendBroadcast(i);消息正确,但 Activity 立即启动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 2012-12-13
  • 1970-01-01
相关资源
最近更新 更多