Я потратил несколько дней, чтобы работать над Service + BroadcastReceiver, но все еще не могу сделать его идеальным. Я надеюсь, что кто-то может помочь, спасибо!
Я пишу приложение, которое отображает текущее местоположение пользователя на карте (карту, которую я написал, а не карту Google) и отправляет уведомление о тревоге, когда пользователь входит в предварительно определенную зону.
В моем коде. Есть два основных объекта. Служба 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 - Зарегистрируйте BroadcastReceiver на Manifest.xml
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 НЕ ДОЛЖЕН УБИВАТЬСЯ ОС во время жизни приложения. Также BroadcastReceiver должен иметь возможность передавать данные в мой Main.java
Я прочитал это актуальное:
http://developer.android.com/reference/android/content/BroadcastReceiver.html
В разделе «Жизненный цикл приемника» и «Жизненный цикл процесса» указано, что BroadcastReceiver будет завершен и больше не будет активен после вызова onReceive (Context, Intent).
Я использую способ 1, я могу получить более 1 данных о местонахождении из службы. Я обнаружил, что BroadcastReceiver сохраняется, если BroadcastReceiver продолжает получать данные из Broadcast.
Если я выключу GPS в «Настройке -> Местоположение» и оставлю BroadcastReceiver на 1-2 часа, то BroadcastReceiver будет убит ОС.
Убивает ли ОС BroadcastReceiver, если он простаивает слишком долго? Разве ОС НЕ уничтожает BroadcastReceiver, если он продолжает получать широковещательные сообщения?
Будет ли BroadcastReceiver (метод 1 и 2) уничтожен ОС, когда он находится в случаях чрезвычайного давления памяти?
Для метода 2, возможно ли, чтобы LocationBoardcastReceiver.java отправлял данные в текущее действие (например, Main, Java)?
Для метода 1 есть ли способ сохранить BroadcastReceiver живым в течение всего времени жизни Main.java (Основная деятельность)?