Dịch vụ dính tiền cảnh của tôi bị hủy sau vài giờ mà không được khởi động lại. Tôi biết điều này đã được hỏi một vài lần, và tôi đã đọc và xác minh tất cả các kiểm tra trên thiết bị của tôi. Điều quan trọng cần lưu ý là điều này dường như chỉ xảy ra trên các thiết bị Huawei.Dịch vụ Foreground bị giết trên Huawei (GRA-UL00) - Các ứng dụng được bảo vệ được kích hoạt
Vì vậy, cho phép tôi cung cấp các chi tiết sau đây.
Dịch vụ định kỳ
public class PeriodicService extends Service {
@Override
public void onCreate() {
super.onCreate();
acquireWakeLock();
foregroundify();
}
private void foregroundify() {
// Omitted for brevity. Yes it does starts a foreground service with a notification
// verified with adb shell dumpsys activity processes > tmp.txt
// entry in tmp.txt => "ProC# 1: prcp T/S/SF trm: 0 14790:my.app.package.indentifier/u0a172 (fg-service)"
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
acquireWakeLock();
if (!isServiceRunningInForeground(this, this.getClass())){
foregroundify();
}
PeriodicAlarmManager alarmManager = PeriodicAlarmManager.get(this);
alarmManager.setAlarm();
return START_STICKY; // after a few hours, service terminates after this returns. verified in my local logs
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
releaseWakeLock();
stopForeground(true);
super.onDestroy();
}
}
PeriodicAlarmManager
public void setAlarm() {
Intent intent = new Intent(mContext, PeriodicAlarmReceiver.class);
intent.setAction("repeat");
mAlarmIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
mAlarmManager.cancel(mAlarmIntent);
long triggerAtMillis = System.currentTimeMillis() + ALARM_INTERVAL_MINUTES;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerAtMillis, mAlarmIntent);
} else {
mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerAtMillis, mAlarmIntent);
}
ComponentName receiver = new ComponentName(mContext, PeriodicBootReceiver.class);
PackageManager pm = mContext.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
PeriodicAlarmReceiver
public class PeriodicAlarmReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, PeriodicService.class);
service.putExtra("source", "PeriodicAlarmReceiver");
intent.getAction()));
startWakefulService(context, service);
}
}
Application
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onLowMemory(){
super.onLowMemory(); // never gets called
}
@Override
public void onTrimMemory(int level){
super.onTrimMemory(level); // only gets called on app launch
}
@Override
public void onTerminate() {
super.onTerminate();
}
}
adb shell quá trình dumpsys activity> tmp.txt
nhập trong tmp.txt => "ProC# 1: prcp T/S/SF trm: 0 14790: my .app.package.indentifier/u0a172 (fg-dịch vụ)"
trên nhập được dựa trên câu trả lời được chấp nhận ở đây: Foreground service being killed by Android
Added MyApp vào danh sách ứng dụng bảo vệ trong Setti ngs-> Cài đặt nâng cao -> Trình quản lý pin -> Ứng dụng được bảo vệ (Cho phép ứng dụng tiếp tục chạy sau khi màn hình tắt)
Hiệu suất đã sử dụng (cài đặt thấp nhất) trong Cài đặt-> Cài đặt nâng cao -> Power Plan (Performance)
Thông tin Device
Model Number: HUAWEI GRA-UL00
EMUI Version: EMUI 4.0.1
Phiên bản Android: 6.0
Ghi chú khác:
Low Memory, onTrimMemory không được gọi trước khi chấm dứt. Trong mọi trường hợp, tôi đã xóa ứng dụng đến mức tối thiểu của nó chỉ để giữ cho ứng dụng hoạt động ẩn, do đó bộ nhớ không phải là vấn đề ở đây.
Dịch vụ chú ý không bao giờ được khởi động lại trừ khi người dùng khởi chạy lại ứng dụng một cách rõ ràng.
Trình quản lý báo thức không được gọi để khởi động lại/tạo lại dịch vụ. setExactAndAllowWhileIdle() không hoạt động, và sẽ không liên quan vì dịch vụ là một dịch vụ ưu tiên nền trước và do đó không bị ảnh hưởng bởi chế độ doze.
Dịch vụ chỉ có thể chạy tối đa 12 giờ trước khi bị chấm dứt. Pin trên 65% khi điều này xảy ra.
Đó là một yêu cầu để giữ cho dịch vụ chạy vô thời hạn vì ứng dụng này là dành cho một dự án nghiên cứu.
Có bất kỳ điều gì khác mà tôi có thể làm hoặc đây có phải là một sửa đổi cụ thể của Huawei Android mà nhà phát triển không thể làm gì cả. Để nhắc lại, vấn đề này chỉ xảy ra trên các thiết bị Huawei.
Đánh giá cao bất kỳ thông tin chi tiết bổ sung nào về điều này!
hey Qin Zhengquan, Bạn đã giải quyết vấn đề dịch vụ nền điện thoại huawei 6.0 chưa? Tôi cũng tìm nạp cùng một vấn đề trong GCM và dịch vụ vị trí của Google API Client. Ngoài ra khi ứng dụng được chấm dứt từ nhiệm vụ nó thực sự giết chết quá trình, vì lý do này tôi đã không nhận được cập nhật vị trí. –
Tôi đã không thực sự quản lý để giải quyết điều này, nhưng tôi đã quản lý để kéo dài tuổi thọ quá trình trên thiết bị bằng cách làm như sau: 1. Giảm dấu chân bộ nhớ 2. Giảm mức tiêu thụ điện 3. Sử dụng dịch vụ nền trước 4 Cài đặt-> Cài đặt nâng cao -> Quản lý pin -> Ứng dụng được bảo vệ (Cho phép ứng dụng tiếp tục chạy sau khi màn hình tắt) - Không có cách nào để bỏ qua bước này. Bạn hoàn toàn cần bật tính năng này, nếu không ứng dụng của bạn sẽ không chạy ở chế độ nền. Kỷ lục dài nhất mà tôi có thể giữ cho ứng dụng chạy trong nền trên Huawei là 12 giờ trước khi bị chấm dứt. –
Cảm ơn bro. Huawei chỉ là nhảm nhí. –