Android Wakelock在电话呼叫意图后丢失

Android Wakelock在电话呼叫意图后丢失,android,android-activity,wakelock,Android,Android Activity,Wakelock,在Android Studio中开发的Android Java应用程序应该跟踪gps位置并拨打电话号码触发街道障碍。该应用程序使用SCREEN_DIM_WAKE_LOCK来保持设备正常运行。我使用动作调用意图调用屏障,它也在工作。要解决的问题是:通话结束后,唤醒锁不再工作,设备在大约10-20秒后进入睡眠状态。当没有通话意图时,设备不会入睡,因此我确信这与通话意图有关。 gps位置跟踪是通过实现位置侦听器的内部私有类完成的。位置侦听器创建一个从ASyncTask派生的新类的实例,以将gps数据发

在Android Studio中开发的Android Java应用程序应该跟踪gps位置并拨打电话号码触发街道障碍。该应用程序使用SCREEN_DIM_WAKE_LOCK来保持设备正常运行。我使用动作调用意图调用屏障,它也在工作。要解决的问题是:通话结束后,唤醒锁不再工作,设备在大约10-20秒后进入睡眠状态。当没有通话意图时,设备不会入睡,因此我确信这与通话意图有关。 gps位置跟踪是通过实现位置侦听器的内部私有类完成的。位置侦听器创建一个从ASyncTask派生的新类的实例,以将gps数据发布到web界面并检查地理围栏,即:调用

我尝试添加标志,如FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TOP,我还在MainActivity的清单中添加了launchMode singleTop,但我还没有找到解决方案

public class MainActivity extends AppCompatActivity {

private LocationManager locationManager;
private LocationListener locationListener;
protected static PowerManager.WakeLock mWakeLock;
protected Handler stopCallHandler = new Handler();


@Override
protected void onCreate(Bundle savedInstanceState) {
  final PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
  mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "MyApp:KeepDeviceAwake");
  this.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
  this.locationListener = new MyLocationListener();
}

public void callPhoneNumber(String number) {
  Intent intent = new Intent(Intent.ACTION_CALL);
  intent.setData(Uri.parse("tel:" + number));
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  this.startActivity(intent);
  // Kill the Call after x seconds
  stopCallHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
      stopCall();
    }
  }, 5000);
}

private class LocationChangedTasks extends AsyncTask<Location, String, Void> {
  @Override
  protected Void doInBackground(Location... locations) {
    // Post location data to internet api for geotracking vehicle (therefore, asynctask is used)
    // get location and check if current location is in geofence
    // if yes, place call
    callPhoneNumber(number);
  }
}

private class MyLocationListener implements LocationListener {
  @Override
  public void onLocationChanged(Location loc) {
    LocationChangedTasks locationchangedtask = new LocationChangedTasks();
    locationchangedtask.execute(loc);
  }
}

public void stopCall() {
  // Uses code from
  // https://stackoverflow.com/questions/599443/how-to-hang-up-outgoing-call-in-android
  // to kill the call
}

}
public类MainActivity扩展了AppCompatActivity{
私人场所经理场所经理;
私有位置侦听器位置侦听器;
受保护的静态PowerManager.WakeLock mWakeLock;
受保护的处理程序stopCallHandler=新处理程序();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
最终PowerManager pm=(PowerManager)getSystemService(Context.POWER\u服务);
mWakeLock=pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,“MyApp:KeepDeviceAwake”);
this.locationManager=(locationManager)getSystemService(Context.LOCATION\u服务);
this.locationListener=新的MyLocationListener();
}
公共无效callPhoneNumber(字符串编号){
意向意向=新意向(意向.行动\调用);
setData(Uri.parse(“tel:+number”);
intent.addFlags(intent.FLAG\u ACTIVITY\u CLEAR\u TOP);
这一点。触觉(意图);
//在x秒后终止呼叫
stopCallHandler.postDelayed(新的Runnable(){
@凌驾
公开募捐{
停止呼叫();
}
}, 5000);
}
私有类LocationChangedTasks扩展异步任务{
@凌驾
受保护的空位背景(位置…位置){
//将位置数据发布到地理跟踪车辆的互联网api(因此,使用asynctask)
//获取位置并检查当前位置是否在geofence中
//如果是,请拨打电话
电话号码;
}
}
私有类MyLocationListener实现LocationListener{
@凌驾
位置更改后的公共无效(位置loc){
LocationChangedTasks locationchangedtask=新LocationChangedTasks();
locationchangedtask.execute(loc);
}
}
公共无效停止呼叫(){
//使用来自的代码
// https://stackoverflow.com/questions/599443/how-to-hang-up-outgoing-call-in-android
//终止通话
}
}

我没有错误消息,我只看到在打电话时系统会进入睡眠状态

您可以尝试以下操作以避免屏幕进入睡眠状态:

(一) 在AndroidManifest.xml中

<activity
     android:name=".MainActivity"
     android:turnScreenOn="true"
     ...>
.......

这是因为当您的活动返回地面时,后台堆栈将被清除,但当您返回到您的活动时,它不会被重新创建。 因此 将这些添加到您的AndroidManifest.xml中

 <activity
        android:name=".MainActivity"
        android:launchMode="singleInstance"
        android:autoRemoveFromRecents="true" />

我喜欢android:turnScreenOn=true,因为它似乎可以防止显示器变暗。我真的不能说这是否导致了问题的解决,因为我们的HTC测试设备从未出现过松动尾流锁的问题。生产设备来自三星,我将让他们测试新版本的应用程序,其中包含您的代码。谢谢您的帖子。似乎这个答案就是解决方案,因为它对我来说听起来很清楚,很明显——尽管我还不能清楚地证实。生产设备来自三星,我的HTC测试设备从来没有解决过唤醒锁的问题(我不知道为什么)。我将有新版本的应用程序,其中包括你的代码正在测试。如果行得通,我会让你知道的。
 <activity
        android:name=".MainActivity"
        android:launchMode="singleInstance"
        android:autoRemoveFromRecents="true" />
@Override
protected void onResume() {
        super.onResume();
        otected void onCreate(Bundle savedInstanceState) {
        final PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,"MyApp:KeepDeviceAwake");
        this.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        this.locationListener = new MyLocationListener();
    }