2016-10-10 17 views
6

Good day, tình hình:Pin tối ưu hóa (wakelocks) trên Huawei EMUI 4.0 +

Tôi đang phát triển ứng dụng Android phục vụ như là ứng dụng thể thao theo dõi/navigation - vì vậy nó đòi hỏi kết nối vĩnh viễn cho GPS và cũng thiết bị luôn hoạt vĩnh viễn . Ghi âm được thực hiện mỗi giây.

Giải pháp hiện tại làm việc trong nhiều năm là nhờ wakelocks giúp thiết bị luôn tỉnh táo.

Chế độ Doze trong Android 6.0+ tình huống phức tạp, nhưng không phải trường hợp này.

Trên thiết bị Huawei có lẽ là loại tối ưu hóa khác.

Dưới đây là một phần của bản ghi:

10-10 10:33:18.462 1014-384 D/PFW.HwPFWAppWakeLockPolicy: getUidWakeLock uid: 10097 wakelock >= 10 mins 10-10 10:33:18.543 1014-384 D/PFW.HwPFWAppWakeLockPolicy: force stop abnormal wakelock app uid: 10097 10-10 10:33:18.558 1014-384 I/ActivityManager: Force stopping menion.android.locus appid=10097 user=0: from pid 1014

Vì vậy, sau khoảng. Trên 30 phút, hệ thống chỉ đơn giản quyết định rằng ứng dụng sử dụng quá nhiều wakelocks và chấm dứt hoàn toàn với tất cả các dịch vụ, lịch sử, chỉ đơn giản là kill.

Bất kỳ trải nghiệm nào với hành vi này và bất kỳ đề xuất nào, cách thực hiện thao tác đơn giản này (ghi vĩnh viễn vị trí GPS khi màn hình tắt) tốt hơn?

Như tôi đã viết lúc bắt đầu, trên tất cả các thiết bị khác ngoại trừ Huawei mới, hệ thống như vậy hoạt động chính xác trong nhiều năm.

EDIT: lưu ý sau khi nhận xét của một người dùng (đã xóa?), Ứng dụng "danh sách trắng" trong trình quản lý pin Huawei (đánh dấu là "ứng dụng được bảo vệ") không ảnh hưởng đến vấn đề này.

Trả lời

1

Bạn đã thử đặt Báo thức thường xuyên phát hành WakeLock và sau đó phản ứng lại sau một vài giây? Nếu vấn đề là Android của Huawei không thích sự lạm dụng của Wakelocks, có lẽ họ sẽ ổn nếu bạn phát hành nó ngay bây giờ và sau đó? Ví dụ: Tôi cho rằng bạn sẽ có một quá trình nền chạy ở nền trước. Nếu vậy, trong chèn onStartCommand của bạn:

setupWakeupAlarm(context); 

nơi phương pháp được định nghĩa là:

private static void setupWakeupAlarm(Context context) { 
    AlarmManager mWakeUpAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    PendingIntent mWakeUpAlarmIntent; 
    Intent serviceIntent; 
    serviceIntent = new Intent(context, SSAlarmReceiver.class); 
    mWakeUpAlarmIntent = PendingIntent.getBroadcast(context, 0, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    // every 5 minutes 
    mWakeUpAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      SystemClock.elapsedRealtime() + WAKEUP_ALARM_FREQUENCY, mWakeUpAlarmIntent); 
    Log.d("TAG", "wakup alarm set up or reset!"); 
} 

và nơi nhận là một lớp địa phương:

static public class SSAlarmReceiver extends WakefulBroadcastReceiver { 
    @Override 
    public void onReceive(final Context context, Intent intent) { 
     setupWakeupAlarm(context); 
     mBackgroundService.stopForeground(true); 
     if (mWakeLock.isHeld()) 
      mWakeLock.release(); 
     new Timer().schedule(
       new TimerTask() { 
        @Override 
        public void run() { 
         mWakeLock.acquire(); 
         mBackgroundService.startForeground(mNotificationId, mNotification.getNotification()); 
         } 
       }, 
       3000 
     ); 
    } 
} 

Lưu ý rằng trong trường hợp của tôi Tôi cũng đã có dịch vụ nền của tôi chạy ở nền trước và tôi quyết định dừng nền trước. Không chắc chắn nó là cần thiết.

Nguy cơ là tất nhiên trong 3 giây mà Wakelock không hoạt động, quá trình của bạn có thể bị giết.

3

Có hai hệ thống Huawei ứng dụng mà có thể giết chết các ứng dụng sử dụng để tiết kiệm pin:

  • SystemManager (com.huawei.systemmanager) giết chết bất kỳ ứng dụng nào vẫn đang chạy sau khi màn hình bị tắt, trừ khi họ đang ở trong " Danh sách ứng dụng được bảo vệ ".
  • PowerGenie (com.huawei.powergenie) giết chết mọi ứng dụng giữ khóa thức trong một thời gian dài.

Có vẻ như ứng dụng của bạn đang bị PowerGenie giết. Bạn có thể tránh điều này bằng cách tận dụng danh sách trắng khóa thẻ đánh thức cứng của PowerGenie. Ví dụ: nếu thẻ khóa chế độ thức ăn của bạn là "LocationManagerService", PowerGenie sẽ bỏ qua, vì dịch vụ hệ thống chứa khóa chế độ thức ăn với cùng một thẻ và PowerGenie đã thêm vào danh sách trắng.