创建BroadcastReceiver的最佳方法是什么?

时间:2011-10-03 14:18:46

标签: android android-activity broadcastreceiver

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

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

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

位置更改时的GPS服务广播位置。主活动接收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
        }
    }

* 我想要的是在应用程序生命周期内OS不会杀死BroadcastReceiver。此外,BroadcastReceiver必须能够将数据传递给我的Main.java

我读到了这个有意义的: http://developer.android.com/reference/android/content/BroadcastReceiver.html

“Receiver Lifecycle”和“Process Lifecycle”部分声明BroadcastReceiver将在onReceive(Context,Intent)调用后完成且不再有效。

我正在使用方法1,我可以从服务中接收多于1个位置数据。我发现如果BroadcastReceiver继续从广播接收数据,则BroadcastReceiver保持活动状态。 如果我在'设置 - &gt;处关闭GPS位置'并让BroadcastReceiver闲置大约1到2个小时,然后BroadcastReceiver将被操作系统杀死。


如果它闲置太久,操作系统是否会杀死BroadcastReceiver?如果它继续接收广播,操作系统是否会杀死BroadcastReceiver?

在极端内存压力的情况下,BroadcastReceiver(方法1和2)是否会被操作系统杀死?

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

对于方法1,是否可以在Main.java(主要活动)的生命周期内使BroadcastReceiver保持活动状态?

2 个答案:

答案 0 :(得分:3)

  1. Android操作系统可随时终止服务和活动。你无能为力。

  2. 即使应用未处于有效状态,您也可以将广播接收器设置为启动服务。

  3. 如果您想要一直接收位置更新,您需要让设备始终保持清醒状态。这将在几个小时内耗尽电池。

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

答案 1 :(得分:2)

  

如果它闲置太久,操作系统是否会杀死BroadcastReceiver?操作系统   如果它继续接收广播,不要杀死BroadcastReceiver?

     

广播接收器(方法1和2)是否会被操作系统杀死   在极端记忆压力的情况下?

接收方收到任何通知后,您的接收方就会开始行动,它的有效持续时间是onReceive()方法。

  

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

糟糕的主意。

  

对于方法1,是否可以使BroadcastReceiver保持活动状态   Main.java(主要活动)的生命周期?

检查上面。

您的最佳方式取决于您的应用所需的内容。

  1. 如果您的应用想要在应用处于前台时使用BroadcastReceiver,那么您应该按照您的提及去寻找Method1

  2. 如果您的应用需要以Boot Completion等方式接收系统通知,那么您应该按照您的提及去寻找Method2