我正在跟踪应用程序。我正在获取更新位置并保存在realm数据库中。
这是我的代码:
Geolocation.getCurrentPosition(
position => {
var speed = JSON.stringify(position.coords.speed);
var accuracy = JSON.stringify(position.coords.accuracy);
if (speed > 0 && (accuracy < 5 || accuracy > 15)) {
var movingLongitude = JSON.stringify(position.coords.longitude);
var movingLatitude = JSON.stringify(position.coords.latitude);
let arr = {
latitude: parseFloat(movingLatitude),
longitude: parseFloat(movingLongitude),
};
let newArr = AppConfig.Coordinates;
newArr.push(arr);
AppConfig.Coordinates = newArr;
EventRegister.emit(Constant.SAVE_COORDINATES,
AppConfig.Coordinates);
}
},
error => {
console.log(error.code, error.message);
},
options,
);
public class Services extends Service {
private static final int SERVICE_NOTIFICATION_ID = 12345;
private static final String CHANNEL_ID = "TrackNTravel";
private Handler handler = new Handler();
private Runnable runnableCode = new Runnable() {
@Override
public void run() {
Context context = getApplicationContext();
Intent myIntent = new Intent(context, Services .class);
context.startService(myIntent);
HeadlessJsTaskService.acquireWakeLockNow(context);
handler.postDelayed(this, 2000);
}
};
private void createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "TrackNTravel", importance);
channel.setDescription("CHANEL DESCRIPTION");
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
this.handler.removeCallbacks(this.runnableCode);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
this.handler.post(this.runnableCode);
createNotificationChannel();
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("TrackNTravel service")
.setContentText("Running...")
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(contentIntent)
.setOngoing(true)
.build();
startForeground(SERVICE_NOTIFICATION_ID, notification);
return START_STICKY;
}
}
- ListFirst Screen点击开始按钮项
- 许可授予
- 许可授予
- 服务启动显示通知
- 在此屏幕位置更新在后台和通知
我的问题是:为什么位置更新在后台模式一段时间后停止?show notification也会在一段时间后从顶部移除。这只发生在Android 11和12版本上。在10及以下版本下可以正常工作。
功能工作时,应用程序是可见的(前台)。但是当应用程序不可见时意味着后台模式服务停止。然后打开应用程序,从启动页面开始。
我觉得我的应用程序杀死,所以发生的位置停止和通知也删除了为什么会发生这种情况。
您可以使用firebase数据库实现这一点。要做到这一点,你可以遵循以下步骤:
- 你尝试在后台初始化firebase应用程序(因为null安全)。 每当用户的经纬度发生变化时,
- 都会将位置数据存储在firebase数据库中。你可以使用下面的代码只传递纬度和经度。
public static void StoreData(String id, double latitude, double longitude) {
if (latitude != 0 || longitude != 0) {
if (MainActivity.firebaseApp != null) { //check if firebase installed or not
FirebaseDatabase database = FirebaseDatabase.getInstance(MainActivity.firebaseApp);
DatabaseReference databaseReference = database.getReference("User").child(id);
//check if latitude and longitude changed or not
//if changed the store that in firebase database
if (_previousLat != latitude || _previousLong != longitude) {
_previousLat = latitude;
_previousLong = longitude;
databaseReference.child("latitude").setValue(latitude);
databaseReference.child("longitude").setValue(longitude);
}
}
}
}
- 在后台使用valueEventlistener从firebase数据库读取它