【问题标题】:My Huawei kills my wakelock android app我的华为杀死了我的唤醒锁安卓应用
【发布时间】:2017-02-04 02:33:02
【问题描述】:

我尝试开发使用手机加速度计的 Android 应用程序。它可以在除华为手机之外的任何地方使用(在 P9 上测试)。我选中了“黑屏继续运行”选项并使用节电程序保护应用程序(电池选项)。

我看不到解决方案,所以我问你:-) 这是我的活动:

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

Listener 和 Detector 对这个问题没用,所以我就不放在这里了。 谢谢你的帮助。

【问题讨论】:

  • 我们在 Voip-App 的 P9 上遇到了完全相同的问题(对 sip 堆栈使用唤醒锁)。任何解决方案都非常感谢!
  • 你的服务没有运行吗?

标签: android kill android-wake-lock huawei-mobile-services


【解决方案1】:

您是否尝试将您的应用列在受保护的应用中?见"Protected Apps" setting on Huawei phones, and how to handle it。华为有一个特殊功能,允许用户选择哪些应用程序可以在后台运行。您可以要求用户接受您的应用在后台运行。但是,显然您只能向他们显示适当的设置页面并要求他们自己启用此功能。此外,我了解您无法通过任何方式以编程方式了解用户是否这样做。

【讨论】:

  • 感谢您的回答。设置中的这种“保护”,工作了几个小时,但之后,华为杀死了应用程序:)
  • 你看过这个 [stackoverflow.com/questions/39954822/…?该人声称问题在于唤醒锁的使用。我建议他停下来几秒钟。然而,我正在测试一个没有唤醒锁的类似程序。手机似乎不需要它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 2015-04-29
  • 2012-08-16
  • 1970-01-01
相关资源
最近更新 更多