【发布时间】: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