gpt4 book ai didi

android - 奥利奥 - 在前台启动服务

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:13:13 24 4
gpt4 key购买 nike

我创建了一项服务,可以在设备移动时跟踪其位置。该服务由与其绑定(bind)的 Activity 启动,在该 Activity 中有一个“Start Tracking”按钮。按下此按钮时,我需要服务在前台启动,以便它存储设备移动到的位置,即使绑定(bind)到它的 Activity 已关闭,或者应用程序已最小化。

我了解要使服务位于前台,必须显示通知。我曾尝试这样做,但是当 Activity 被销毁时,我无法获得显示的通知或在前台工作的服务。

由于通知 channel 的原因,Oreo 中的通知似乎发生了变化,但我无法弄清楚需要做哪些不同的事情。我正在测试的设备是 8.0.0。

这是我的服务:

public class LocationTrackerService extends Service {

private LocationListener locationListener;
private LocationManager locationManager;
private IBinder binder = new LocalBinder();
private boolean isTracking;
private ArrayList<Location> trackedWaypoints;
private String bestProvider;
private Timer timer;
private Distance distance;

@SuppressLint("MissingPermission")
@Override
public void onCreate() {
super.onCreate();

locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
bestProvider = locationManager.getBestProvider(criteria, true);

isTracking = false;

locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
Intent intent = new Intent("location_update");
intent.putExtra("latitude", location.getLatitude());
intent.putExtra("longitude", location.getLongitude());
sendBroadcast(intent);
if (isTracking) {
if (trackedWaypoints.size() > 1) {
distance.add(trackedWaypoints.get(trackedWaypoints.size() - 1).distanceTo(location));
}
trackedWaypoints.add(location);
}
}

@Override
public void onStatusChanged(String s, int i, Bundle bundle) { }

@Override
public void onProviderEnabled(String s) { }

@Override
public void onProviderDisabled(String s) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
};

locationManager.requestLocationUpdates(bestProvider, 0, 0, locationListener);
}

@Override
public void onDestroy() {
super.onDestroy();
if (locationManager != null) {
locationManager.removeUpdates(locationListener);
}
}

public void startTracking() {
trackedWaypoints = new ArrayList<Location>();
timer = new Timer();
distance = new Distance();
timer.start();
isTracking = true;
startInForeground();
}

private void startInForeground() {
Intent notificationIntent = new Intent(this, WorkoutActivity.class);
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, notificationIntent, 0);

Notification notification =
new Notification.Builder(this)
.setContentTitle("TEST")
.setContentText("HELLO")
.setSmallIcon(R.drawable.ic_directions_run_black_24dp)
.setContentIntent(pendingIntent)
.setTicker("TICKER")
.build();

startForeground(101, notification);
}

public void stopTracking() {
isTracking = false;
stopForeground(true);
}

public boolean isTracking() {
return isTracking;
}

public ArrayList<Location> getTrackedWaypoints() {
return trackedWaypoints;
}

public Timer getTime() {
timer.update();
return timer;
}

public Distance getDistance() {
return distance;
}

public int getSteps() {
return 0;
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}

public class LocalBinder extends Binder {
public LocationTrackerService getLocationTrackerInstance() {
return LocationTrackerService.this;
}
}
}

最佳答案

尝试使用以下代码更改您的 startInForeground() 方法:

private void startInForeground() {
Intent notificationIntent = new Intent(this, WorkoutActivity.class);
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,notificationIntent,0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this,NOTIFICATION_CHANNEL_ID)
.setSmallIcon(R.drawable.shsl_notification)
.setContentTitle("TEST")
.setContentText("HELLO")
.setTicker("TICKER")
.setContentIntent(pendingIntent);
Notification notification=builder.build();
if(Build.VERSION.SDK_INT>=26) {
NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription(NOTIFICATION_CHANNEL_DESC);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
}
startForeground(NOTIFICATION_ID, notification);
}

因此,当您的 Android 版本是 Oreo(或更高版本)时,将创建通知 channel ,否则不会。

关于android - 奥利奥 - 在前台启动服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47611123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com