7

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!

+0

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í. –

+2

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. –

+0

Cảm ơn bro. Huawei chỉ là nhảm nhí. –

Trả lời

0

Bạn có chắc chắn bạn cần wakelock không? Tôi có một dịch vụ tương tự và tôi đã nhận thấy rằng nó hoạt động ngay cả khi không có wakelock. Điều này post tuyên bố rằng kẻ giết người là wakelock. Tôi đã thử với quy trình đã từng bị giết trong vài phút và hiện giờ nó đã hoạt động hàng giờ.

0

Huawei -> có cài đặt pin nhưng không phải về chế độ tiết kiệm pin. dưới màn hình cài đặt pin này, có menu phụ gọi là "Ứng dụng được bảo vệ" (không chắc chắn tên). bạn cần cho phép ứng dụng của mình được bảo vệ để ngăn ứng dụng của Huawei giết sau khi khóa màn hình.

+1

Xin chào Jonz, tôi đã thêm vào Ứng dụng được bảo vệ (Vui lòng xem câu hỏi). Nó chạy ở chế độ nền sau khi khóa màn hình trong tối đa 12 giờ. Vấn đề là, tôi không thể đi nhiều hơn là không giống như các thiết bị Android khác. –

+0

bạn không bắt đầu dịch vụ của bạn như foregorund trong mã này. –

0

Có vẻ như ứng dụng của bạn đang bị giết bởi Huawei PowerGenie vì ứng dụng này có khóa đánh thức vô thời hạn. Nếu bạn không thể tránh sử dụng khóa đánh thức, vui lòng xem my answer to a similar question để giải quyết sự cố.

Các vấn đề liên quan