2016-10-20 2 views
7

Я пытаюсь разработать приложение для Android, которое использует акселерометр телефона. Он работает везде, кроме телефона Huawei (тестирование на P9). Я проверил опцию «продолжаю работать с черным экраном» и защищаю приложение с помощью аккумулятора (опция батареи).My Huawei убивает мое приложение Android-приложения wakelock

Я не могу увидеть решение, поэтому я прошу вас :-) Это моя активность:

public class MainActivity extends AppCompatActivity { 

private static final String TAG = "MainActivity"; 
private MyService mService; 
private boolean mIsRunning; 
private MyService.ICallback mCallback = new MyService.ICallback() { 
    public void changed() { 
     Log.i(TAG, "CHANGED"); 
    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if(!mIsRunning) { 
     startStepService(); 
    } 
    bindStepService(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    if(mIsRunning && mService != null) { 
     unbindStepService(); 
    } 
} 

private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     mService = ((MyService.StepBinder)service).getService(); 
     mService.registerCallback(mCallback); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     mService = null; 
    } 
}; 

private void startStepService() { 
    if (! mIsRunning) { 
     mIsRunning = true; 
     startService(new Intent(MainActivity.this, MyService.class)); 
    } 
} 

private void bindStepService() { 
    bindService(new Intent(MainActivity.this, MyService.class), mConnection, Context.BIND_AUTO_CREATE); 
} 

private void unbindStepService() { 
    unbindService(mConnection); 
} 

И моя служба:

public class MyService extends Service { 
private static final String TAG = "Test"; 
private SensorManager mSensorManager; 
private Detector detector; 
private MyDisplayer displayer; 
private PowerManager.WakeLock wakeLock; 
private ICallback mCallback; 
private MyDisplayer.Listener mStepListener = new MyDisplayer.Listener() { 
    public void changed() { 
     passValue(); 
    } 

    public void passValue() { 
     if (mCallback != null) { 
      mCallback.changed(); 
     } 
    } 
}; 
private final IBinder mBinder = new StepBinder(); 
public static final int MyID = 1234; 
android.app.Notification Notification; 

public class StepBinder extends Binder { 
    public MyService getService() { 
     return MyService.this; 
    } 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    acquireWakeLock(); 
    displayer = new MyDisplayer(); 
    displayer.addListener(mStepListener); 
    registerDetector(); 
    startServiceNotification(); 
} 

private void registerDetector() { 
     mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     detector = new Detector(); 
     detector.addStepListener(displayer); 
     Sensor mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     mSensorManager.registerListener(detector, mSensor, SensorManager.SENSOR_DELAY_GAME); 
} 

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


public interface ICallback { 
    void changed(); 
} 



public void registerCallback(ICallback cb) { 
    mCallback = cb; 
} 

private void startServiceNotification() { 
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.logo_32) 
      .setContentTitle("Test") 
      .setPriority(Notification.PRIORITY_HIGH) 
      .setContentText("My Notif"); 
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
    Intent resultIntent = new Intent(this, MainActivity.class); 
    stackBuilder.addNextIntent(resultIntent); 
    PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
    mBuilder.setContentIntent(resultPendingIntent); 
    startForeground(MyID, mBuilder.build()); 
} 

private void acquireWakeLock() { 
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    int wakeFlags = PowerManager.PARTIAL_WAKE_LOCK; 
    wakeLock = pm.newWakeLock(wakeFlags, TAG); 
    wakeLock.acquire(); 
} 


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_STICKY; 
} 

Слушатель и детектор бесполезны для эта проблема, поэтому я не ставил их здесь. Благодарим вас за помощь.

+0

У нас точно такая же проблема здесь, на P9 в нашем Voip-приложении (с использованием wakelock для sip-стека). Любые решения высоко оценены! – Grisgram

+0

Ваш сервис не работает? – W4R10CK

ответ

0

Вы пытались указать свое приложение среди защищенных приложений? См. "Protected Apps" setting on Huawei phones, and how to handle it. У Huawei есть специальная функция, которая позволяет пользователям выбирать, какие приложения могут выполняться в фоновом режиме. Вы можете попросить пользователя принять, что ваше приложение работает в фоновом режиме. Очевидно, однако вы можете показать только соответствующую страницу stetting и попросить, чтобы они включили эту функцию самостоятельно. Также я понимаю, что у вас нет никакого способа узнать программно, если пользователь сделал это.

+0

Thx для вашего ответа. Эта «защита» в настройках работала несколько часов, но после этого Huawei убила приложение :) – Leo

+0

Вы видели это [http://stackoverflow.com/questions/39954822/battery-optimizations-wakelocks-on-huawei-emui- 4-0] (пост)? Человек утверждает, что проблема заключается в использовании вакелока. Я предложил ему остановить его на несколько секунд. Тем не менее, я тестирую аналогичную программу без wakelock. Телефон, похоже, не нуждается в этом – FabioC

Смежные вопросы