【问题标题】:What is the best way of create BroadcastReceiver?创建广播接收器的最佳方法是什么?
【发布时间】:2011-10-03 14:18:45
【问题描述】:

我花了几天时间在 Service + BroadcastReceiver 上工作,但仍然无法使其完美。希望有人能帮忙,谢谢!

我正在编写一个应用程序,在地图上显示用户当前位置(我写的地图,而不是谷歌地图),并在用户进入预定义区域时发出通知警报。

在我的代码中。有两个主要对象。 GPS 服务和主要活动。

位置改变时的 GPS 服务广播位置。 Main Activity 通过 BroadcastReceiver 接收最新的位置。

我对如何注册BroadcastReceiver做了一些研究。我找到了两种方法:


方法 1 - 在 Activity 中注册广播接收器(我在我的代码中使用此方法。我需要更新地图上的最新位置)

Main.java:

public class Main extends Activity{
.
.
.
    public class MyLocReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub

            Bundle bundle=intent.getExtras();
            String locData = bundle.getString("loc");

            // Some work


        }
        public MyLocReceiver(){
            Log.e(TAG, "in MyReceiver()");
        }

    }

    private MyLocReceiver myLocReceiver;

    // Register BroadcastReceiver
    if (myLocReceiver == null)
        {
            Common.writeFile("service.txt", "Main - in myBindService() register receiver" + "\n", true);

            myLocReceiver=new MyLocReceiver();

            registerReceiver(myLocReceiver, new IntentFilter("com.nwfb.LOC_DATA"));
        }

方法 2 - 在 Manifest.xml 中注册 BroadcastReceiver

Manifest.xml:

    <receiver android:name=".LocationBoardcastReceiver" android:enabled="true"> 
            <intent-filter>
                <action android:name="com.abc.LOC_DATA" /> 
            </intent-filter> 
    </receiver>

LocationBoardcastReceiver.java:

    public class LocationBoardcastReceiver extends BroadcastReceiver {
        private static final String TAG = LocationBoardcastReceiver.class.getSimpleName();

        @Override
        public void onReceive(Context context, Intent intent) {

        Bundle bundle=intent.getExtras();
        // Do something
        }
    }

* 我想要的是广播接收器在应用程序生命周期内不能被操作系统杀死。此外,BroadcastReceiver 必须能够将数据传递给我的 Main.java

我读过这篇实事: http://developer.android.com/reference/android/content/BroadcastReceiver.html

'Receiver Lifecycle' 和 'Process Lifecycle' 部分表明 BroadcastReceiver 将在 onReceive(Context, Intent) 调用后完成并且不再处于活动状态。

我正在使用方法 1,我可以从服务接收多个位置数据。我发现如果 BroadcastReceiver 继续从广播接收数据,BroadcastReceiver 就会保持活动状态。 如果我在“设置 -> 位置”关闭 GPS 并让 BroadcastReceiver 空闲大约 1 到 2 小时,那么 BroadcastReceiver 将被操作系统杀死。


如果 BroadcastReceiver 空闲时间过长,操作系统会杀死它吗?如果它继续接收广播,操作系统是否不会杀死 BroadcastReceiver?

BroadcastReceiver(方法 1 和 2)会在内存压力过大的情况下被 OS 杀死吗?

对于方法 2,LocationBoardcastReceiver.java 是否可以将数据发送到正在运行的活动(例如:Main、java)?

对于方法1,有什么办法可以让BroadcastReceiver在Main.java(Main Activity)的生命周期内保持活跃?

【问题讨论】:

  • Knickedi,谢谢提醒。顺便问一下,你对我的问题有什么想法吗?

标签: android android-activity broadcastreceiver


【解决方案1】:
  1. Android 操作系统可以随时终止服务和活动。您对此无能为力。

  2. 您可以设置广播接收器以启动服务,即使应用程序未处于活动状态。

  3. 如果您想一直接收位置更新,您需要让设备一直处于唤醒状态。这将在数​​小时内耗尽电池电量。

有关位置更新的最佳做法,请阅读:http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html?m=1

【讨论】:

    【解决方案2】:

    如果 BroadcastReceiver 空闲时间过长,操作系统会杀死它吗?操作系统是否 如果 BroadcastReceiver 一直在接收广播,就不要杀死它吗?

    BroadcastReceiver(方法 1 和 2)是否会被 OS 杀死? 在极端记忆压力的情况下?

    您的接收器在收到任何通知时开始工作,并且它的活动持续时间是 onReceive() 方法。

    对于方法 2,LocationBoardcastReceiver.java 是否可能 将数据发送到正在运行的活动(例如:Main、java)?

    坏主意。

    对于方法 1,是否有任何方法可以让 BroadcastReceiver 在 Main.java(Main Activity)的生命周期?

    检查上面。

    您的最佳方式取决于您的应用需要什么。

    1. 如果您的应用想要在应用处于前台时使用 BroadcastReceiver,那么您应该使用 Method1,正如您所提到的。

    2. 如果您的应用需要以Boot Completion 等接收系统通知,那么您应该使用Method2,正如您所提到的。

    【讨论】:

    • 我想澄清一点。对于方法 1,注册的 BroadcastReceiver 会在 Activity 生命周期内被操作系统杀死吗?如果是,我怎么知道它什么时候被杀?因为我必须确保 BroadcastReceiver(在 Main.java 中)可以随时从 Service 接收数据。谢谢
    • 您的 BroadcastReceiver 不会被杀死,但是如果您的应用需要资源,您的应用正在使用它,它可能会被操作系统杀死。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2017-08-06
    • 2022-01-05
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多