Я новичок в Android и пробовал почти все методы использования общих настроек, но когда я пытаюсь получить значение в режиме бездействия, метод класса не работает, ТОЛЬКО ЕСЛИ ПРИЛОЖЕНИЕ УДАЛЕНО ИЗ ПОСЛЕДНИХ ПРИЛОЖЕНИЙ.
Мой сценарий похож:
Класс LocationRequestHelper.java
import android.content.Context;
import android.preference.PreferenceManager;
public class LocationRequestHelper {
...
...
public static String getUserId() {
return MainActivity.preferences.getString("userId","");
}
public static void setUserId(String userId) {
MainActivity.preferences.edit().putString("userId", userId ).commit();
}
}
Основная деятельность
public class MainActivity extends FragmentActivity implements
SharedPreferences.OnSharedPreferenceChangeListener {
public static SharedPreferences preferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
preferences = PreferenceManager.getDefaultSharedPreferences(this);
LocationRequestHelper.setUserId("1");
....
....
Утилиты
public class Utils {
public static void getLocationUpdates(final Context context, final Intent intent, String broadcastevent){
LocationResult result = LocationResult.extractResult(intent);
if (result != null) {
List<Location> locations = result.getLocations();
Location firstLocation = locations.get(0);
accuracy = firstLocation.getAccuracy();
LocationData data = new LocationData();
// MY FUNCTION DOESN'T WORK HERE
data.setUsrid(LocationRequestHelper.getUserId());
updateServer(data);
}
}
getLocationUpdates вызывается из BroadcastReceiver
Теперь проблемы возникают после того, как я пытаюсь получить идентификатор пользователя с помощью
LocationRequestHelper.getUserId();
EDITED: добавлен код трансляции
МестоположениеОбновленияШироковещательная передачаПриемник
public class LocationUpdatesBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "LUBroadcastReceiver";
public static final String ACTION_PROCESS_UPDATES = "PROCESS_UPDATES";
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
final String action = intent.getAction();
if (ACTION_PROCESS_UPDATES.equals(action)) {
Utils.getLocationUpdates(context,intent,"PROCESS_UPDATES");
}
}
}
}
ПРИМЕЧАНИЕ: ЭТО РАБОТАЕТ ОТЛИЧНО, ЕСЛИ ПРИЛОЖЕНИЕ НА ФОНЕ. НО АВАРИИ ПОСЛЕ УБИЙСТВА ИЗ ПОСЛЕДНИХ ПРИЛОЖЕНИЙ.
Скажите, пожалуйста, как я могу отправить сохраненный идентификатор пользователя в моем вызове API?
извините за шапки, но это основная проблема: P
@santoXme Я хочу, чтобы трансляция вызывала метод, использующий значение идентификатора пользователя. Так зачем отменять регистрацию?
когда вы удаляете приложение из фона, вы должны отменить регистрацию трансляции. Пока приложение не находится в фоновом режиме, нет необходимости отменять регистрацию получателя. И после уничтожения приложения я не думаю, что вам нужен идентификатор пользователя val в любом месте
Хотя информация о широковещательных приемниках верна, причина сбоя приложения в том, что все статические переменные будут нулевыми после того, как приложение будет убито. Также вероятно утечка памяти. Не используйте для этого статические переменные
Могу я спросить, какое исключение выдает приложение при сбое? Я думаю, вы получаете NullPointerException, потому что MainActivity имеет значение null, когда приложение убито
@ jolly.exe вы получаете просочившееся исключение IntentReceiver
Добавлен код трансляции @Jahnold, это может быть проблемой. Может ли кто-нибудь научить меня, как хранить сохраненные значения и какой контекст использовать при использовании SharedPreference?
@AloDev Я не могу отследить остановку отладчика рекламы, когда приложение было убито из недавнего
Причина сбоя приложения в том, что при его отключении любые статические переменные становятся null. Однако вы все еще пытаетесь получить доступ к SharedPreferences из широковещательного приемника и, таким образом, получаете NPE.
Первое, что вы можете сделать, это обновить свой класс LocationRequestHelper, чтобы он принял контекст в методе, а не использовал статические SharedPreferences:
public class LocationRequestHelper {
//...
public static String getUserId(Context context) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
return prefs.getString("userId","");
}
public static void setUserId(Context context, String userId) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.edit().putString("userId", userId ).commit();
}
}
Затем обновите свой MainActivity, чтобы избавиться от бизнеса SharedPrefs, и измените вызов на:
LocationRequestHelper.setUserId(this, "1");
И класс Utils для:
data.setUsrid(context, LocationRequestHelper.getUserId());
Вы отменили регистрацию широковещательного приемника в уничтожении вашего класса