我的任务是跟踪司机位置一天或两天,所以我FusedLocationProviderClient要从FireBase Realtime Database. 它在 N、O、P 中工作正常,Marshmallow但由于类似 android 的新政策,它正在丢弃服务。没有继续background service。
以前我尝试过使用服务,但由于 Android Os kills JobIntentService,我这两个概念都无法继续记录。android version >= Nbackground service
public class MyJobIntentService extends JobIntentService {
final Handler mHandler = new Handler();
private static final String TAG = "MyJobIntentService";
/**
* Unique job ID for this service.
*/
private static final int JOB_ID = 2;
public static void enqueueWork(Context context, Intent intent) {
enqueueWork(context, MyJobIntentService.class, JOB_ID, intent);
}
@Override
public void onCreate() {
super.onCreate();
showToast("Job Execution Started");
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
int maxCount = intent.getIntExtra("maxCountValue", -1);
/**
* Suppose we want to print 1 to 1000 number with one-second interval, Each task will take time 1 sec, So here now sleeping thread for one second.
*/
TimerTask repeatedTask = new TimerTask() {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/// }
Log.d("onStartCommand:","TrackingService111");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
startMyOwnForeground();
else
buildNotification();
loginToFirebase();
}
};
Timer timer = new Timer("Timer");
timer.scheduleAtFixedRate(repeatedTask, 30000, 30000);
}
@Override
public void onDestroy() {
super.onDestroy();
showToast("Job Execution Finished");
}
// Helper for showing tests
void showToast(final CharSequence text) {
mHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyJobIntentService.this, text, Toast.LENGTH_SHORT).show();
}
});
}
private void buildNotification() {
String stop = "stop";
registerReceiver(stopReceiver, new IntentFilter(stop));
PendingIntent broadcastIntent = PendingIntent.getBroadcast(
this, 0, new Intent(stop), PendingIntent.FLAG_UPDATE_CURRENT);
// Create the persistent notification
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setContentTitle(getString(R.string.app_name))
.setContentText("Testing!!")
.setOngoing(true)
.setContentIntent(broadcastIntent)
.setSmallIcon(R.drawable.tracking);
startForeground(1, builder.build());
}
private void startMyOwnForeground() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String NOTIFICATION_CHANNEL_ID = "com.example.simpleapp";
String channelName = "My Background Service";
NotificationChannel chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_NONE);
chan.setLightColor(Color.BLUE);
chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
assert manager != null;
manager.createNotificationChannel(chan);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
Notification notification = notificationBuilder.setOngoing(true)
//.setSmallIcon(AppSpecific.SMALL_ICON)
.setContentTitle("App is running in background")
.setPriority(NotificationManager.IMPORTANCE_MIN)
.setCategory(Notification.CATEGORY_SERVICE)
.build();
startForeground(2, notification);
}
}
protected BroadcastReceiver stopReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "received stop broadcast");
// Stop the service when the notification is tapped
unregisterReceiver(stopReceiver);
stopSelf();
}
};
private void loginToFirebase() {
// Authenticate with Firebase, and request location updates
final String email = getString(R.string.firebase_email);
final String password = getString(R.string.firebase_password);
FirebaseAuth.getInstance().signInWithEmailAndPassword(email, password)
.addOnCompleteListener( new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d(TAG, "firebase auth success");
requestLocationUpdates();
} else {
Log.d(TAG, "firebase auth failed");
Log.e(TAG, "onComplete: Failed=" + task.getException().getMessage());
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
if (e instanceof FirebaseAuthRecentLoginRequiredException) {
AuthCredential credential = EmailAuthProvider
.getCredential(email, password);
}
}
});
}
private void requestLocationUpdates() {
LocationRequest request = new LocationRequest();
request.setInterval(10000);
request.setFastestInterval(50000);
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(this);
final String path = getString(R.string.firebase_path) + "/" + getString(R.string.transport_id);
int permission = ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION);
if (permission == PackageManager.PERMISSION_GRANTED) {
// Request location updates and when an update is
// received, store the location in Firebase
client.requestLocationUpdates(request, new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
DatabaseReference ref = FirebaseDatabase.getInstance().getReference(path);
Location location = locationResult.getLastLocation();
if (location != null) {
Log.d(TAG, "location update " + location);
// Toast.makeText(getApplication(),"location update " + location,Toast.LENGTH_LONG).show();
ref.setValue(location);
}
}
}, null);
}
}