2016-10-20 20 views
7

Telefonun ivmeölçerini kullanan Android için uygulama geliştirmeye çalışıyorum. Huawei'nin telefonu dışında her yerde çalışır (P9'da test). "Siyah ekranla çalışmaya devam et" seçeneğini işaretledim ve uygulamayı pil tasarrufu ile korudum (pilin seçeneği).My Huawei, wakelock android uygulamamı öldürüyor

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); 
} 

Ve Hizmet:

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; 
} 

Dinleyici ve Dedektör için yararsız

Bu benim faaliyettir :-) Ben çözüm göremiyorum, bu yüzden sana sormak Bu yüzden onları buraya koymam. Yardımlarınız için teşekkür ederiz.

+0

Voip-App'imizde (Sip yığını için wakelock kullanarak) bir P9'da tam olarak aynı soruna sahibiz. Herhangi bir çözüm çok takdir! – Grisgram

+0

Hizmetiniz çalışmıyor mu? Cevabınız için – W4R10CK

cevap

0

Uygulamanızı korumalı uygulamalar arasında listelemeyi denediniz mi? Bakınız "Protected Apps" setting on Huawei phones, and how to handle it. Huawei'nin, kullanıcıların arka planda hangi uygulamaların çalışabileceğini seçmelerine izin veren özel bir özelliği vardır. Kullanıcının uygulamanızın arka planda çalıştığını kabul etmesini isteyebilirsiniz. Ancak görünüşe göre onlara sadece uygun ıslanma sayfasını gösterebilir ve bu özelliği kendilerinin etkinleştirmelerini isteyebilirsiniz. Ayrıca, kullanıcının bunu yapması durumunda programsal olarak bilmenin herhangi bir yolunun olmadığını anlıyorum.

+0

Thx. Bu "koruma" ayarları, birkaç saat çalıştı ama sonra, Huawei uygulaması öldürdü :) – Leo

+0

Bunu gördünüz mü [http://stackoverflow.com/questions/39954822/battery-optimizations-wakelocks-on-huawei-emui- 4-0] (post)? Kişi, sorunun wakelock kullanımı olduğunu iddia ediyor. Birkaç saniyeliğine onu durdurmasını önerdim. Ancak, uyandırma olmadan benzer bir programı test ediyorum. Telefon buna ihtiyaç duymuyor gibi görünüyor – FabioC

İlgili konular