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