2016-10-20 7 views
7

私は携帯電話の加速度計を使用するAndroidのためのアプリを開発しようとします。それはHuaweiの電話を除いてどこでも動作します(P9のテスト)。 「黒い画面で走り続ける」というオプションをチェックし、バッテリーセーバー(バッテリーのオプション)でアプリケーションを保護しました。私のHuaweiは私のwakelock android appを殺します

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では、まったく同じ問題が発生しています(sipスタック用のwakelockを使用)。どんなソリューションも高く評価されています! – 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/39954822/battery-optimizations-wakelocks-on-huawei-emui- 4-0](ポスト)?その人は、その問題は、ウォークロックの使用であると主張する。私は彼に数秒間それを止めるように勧めました。しかし、私は同じようなプログラムをwakelockなしでテストしています。電話はそれを必要としていないようです – FabioC

関連する問題