【问题标题】:Broadcast doesn't get started广播没有开始
【发布时间】:2016-11-14 03:06:04
【问题描述】:

这是我第一次尝试创建安卓应用。我正在尝试创建一个可以在后台计算的服务,并且我希望该服务将时间广播给接收器。不过,接收器似乎没有收到任何东西,所以我不确定我的服务是否开始了。

这是我尝试启动服务并创建接收器的代码:

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    IntentFilter filter = new IntentFilter();
    filter.addAction("EXAMPLE_BROADCAST");

    clock = (TextView) findViewById(R.id.textClock);

    timeReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            setClock(intent.getLongExtra("counter", 0));
        }
    };

    registerReceiver(timeReceiver,filter);

    startService(new Intent(this, CounterService.class));
}

public void setClock(long time){
    clock.setText(String.valueOf(time));
}

这是我的服务类:

public class CounterService extends Service {
private Handler handler;
private long initialTime;
private long timeInMilliseconds = 0L;
private boolean isActive;
Intent timeBroadcaster = new Intent("EXAMPLE_BROADCAST");

@Override
public void onCreate(){
    super.onCreate();

    Runnable counter = new Runnable() {
        @Override
        public void run() {
            isActive = ((PowerManager) getSystemService(Context.POWER_SERVICE)).isInteractive();
            if(isActive) {
                timeInMilliseconds += 1000;
                handler.postDelayed(this, 1000);
            }
            else {
                if(timeInMilliseconds > 5000) {
                    timeInMilliseconds = 0;
                }
                handler.postDelayed(this, 1000);
            }
            timeBroadcaster.putExtra("counter", timeInMilliseconds);
            sendBroadcast(timeBroadcaster);
        }
    };
}


@Override
public IBinder onBind(Intent intent) {
    return null;
}

}

感谢任何帮助,谢谢。

【问题讨论】:

  • 你是否在 manifest 中定义了服务?
  • 你注册你的接收器了吗?
  • @Smartiz 是的,我做到了! ://
  • @maxost 不。我不确定我是否必须这样做。你能解释一下怎么做吗?

标签: android broadcast


【解决方案1】:

Runnable 不会自己执行,你需要把它交给线程。

Runnable counter = new Runnable() {
        @Override
        public void run() {
            isActive = ((PowerManager) getSystemService(Context.POWER_SERVICE)).isInteractive();
            if(isActive) {
                timeInMilliseconds += 1000;
                handler.postDelayed(this, 1000);
            }
            else {
                if(timeInMilliseconds > 5000) {
                    timeInMilliseconds = 0;
                }
                handler.postDelayed(this, 1000);
            }
            timeBroadcaster.putExtra("counter", timeInMilliseconds);
            sendBroadcast(timeBroadcaster);
        }
    };

Thread thread = new Thread(counter);
thread.start();

同时在清单中注册您的服务:

<!--Register service-->
  <service android:name="yourpackage.CounterService" />

【讨论】:

    【解决方案2】:

    您需要注册您的接收器。

    在您的活动的onStart 方法中

    IntentFilter filter = new IntentFilter();
    filter.addAction("YOUR_ACTION");
    registerReceiver(timeReceiver, filter)
    

    在您的活动的onStop 方法中

    unregisterReceiver(timeReceiver)
    

    在发送广播之前,将您的操作添加到Intent

    timeBroadcaster.setAction("YOUR_ACTION");
    

    【讨论】:

    • 除了接收者之外,它还需要一个 IntentFilter。我应该如何创建它?
    • 还是没有运气。我更新了我的代码。你能发现任何错误吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 2013-07-29
    • 2022-10-23
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    相关资源
    最近更新 更多