我花了几天时间在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保持活动状态?
答案 0 :(得分:3)
Android操作系统可随时终止服务和活动。你无能为力。
即使应用未处于有效状态,您也可以将广播接收器设置为启动服务。
如果您想要一直接收位置更新,您需要让设备始终保持清醒状态。这将在几个小时内耗尽电池。
有关位置更新的最佳做法,请阅读以下内容: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(主要活动)的生命周期?
检查上面。
您的最佳方式取决于您的应用所需的内容。
如果您的应用想要在应用处于前台时使用BroadcastReceiver,那么您应该按照您的提及去寻找Method1
。
如果您的应用需要以Boot Completion
等方式接收系统通知,那么您应该按照您的提及去寻找Method2
。