phone 呼叫意图后唤醒锁丢失

Wakelock lost after phone call intent

在 Android Studio 中开发的 Android Java 应用程序应跟踪 gps 位置并拨打 phone 号码以触发街道障碍。该应用程序使用 SCREEN_DIM_WAKE_LOCK 来保持设备 运行,这 运行 没问题。我使用 ACTION_CALL 意图来调用屏障,它也有效。要解决的问题是:调用完成后,wake lock 不再起作用,设备在大约 10-20 秒后进入睡眠状态。当没有呼叫意图时,设备不会睡着,所以我确信它与 phone 呼叫意图有关。 gps 位置跟踪是通过实现位置侦听器的内部私有 class 完成的。位置侦听器创建一个新的 class 派生自 ASyncTask 的实例,以 post 将 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
  // 
  // to kill the call
}

}

我没有任何错误消息,我只看到系统在拨打 phone 电话后进入休眠状态

您可以试试这个来避免屏幕进入休眠状态:

1) 在AndroidManifest.xml

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

2) 在MainActivity.java

@Override
protected void onResume() {
    super.onResume();
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

发生这种情况是因为当您的 activity 返回地面时,返回堆栈将被清除,但是当您返回到您的 activity 时,它不会被重新创建。 所以为此 将这些添加到您的 AndroidManifest.xml

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

这将有助于让您的 activity 处于后台,直到您调用 finish();

并且还包括当您的 activity 在

中重新启动时您需要调用的功能

onResume()

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