2016-10-20 4 views
7

나는 휴대 전화의 가속도계를 사용하는 Android 용 앱을 개발하려고한다. Huawei의 전화를 제외한 모든 곳에서 작동합니다 (P9 테스트). "검은 색 화면으로 계속 실행"옵션을 선택하고 배터리 세이버 (배터리 옵션)로 애플리케이션을 보호합니다.내 화웨이가 내 wakelock android 앱을 죽인다

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

Voip-App의 P9에 똑같은 문제가 있습니다 (모아서 묶음에 wakelock 사용). 모든 솔루션을 높이 평가! – Grisgram

+0

서비스가 실행되고 있지 않습니까? 귀하의 답변은 – W4R10CK

답변

0

보호 된 앱 중에 앱을 나열 해 보았습니까? "Protected Apps" setting on Huawei phones, and how to handle it을 참조하십시오. Huawei는 사용자가 백그라운드에서 실행할 수있는 응용 프로그램을 선택할 수있는 특별한 기능을 제공합니다. 앱이 백그라운드에서 실행된다는 사실을 사용자에게 확인하도록 요청할 수 있습니다. 분명히 그러나 당신은 그들에게 적절한 stetting 페이지를 보여줄 수 있고 그들이이 기능을 스스로 가능하게하도록 요청할 수 있습니다. 또한 사용자가 그렇게했는지 프로그래밍 방식으로 알 수있는 방법이 없다는 것도 알고 있습니다.

+0

Thx입니다. 몇 시간 동안 작동하지만, 화웨이는 앱을 죽였습니다. 설정 :이 설정을 "보호"합니다. – Leo

+0

이것을 보았습니까 [http://stackoverflow.com/questions/39954822/battery-optimizations-wakelocks-on-huawei-emui- 4-0] (포스트)? 그 사람은 그 문제가 wakelock의 사용이라고 주장한다. 나는 그에게 잠시 멈추라 고 제안했다. 나는 그러나 wakelock없이 비슷한 프로그램을 테스트하고있다. 전화가 필요없는 것 같아요. – FabioC