Activity 报警后触发 (RTC_WAKEUP) 但屏幕仍然黑屏
Activity triggers after alarm (RTC_WAKEUP) but screen remains black
我正在设置一个关于如何对 Android 中的警报做出反应的骨架应用程序。当 phone 唤醒时一切正常,当 phone 睡眠时警报触发(我什至可以激活振动器)但屏幕保持关闭状态(完全黑)。我无法解释为什么。欢迎任何帮助!
这是 MainActivity 中设置 alarmManager 的代码片段(E1 是一个 EditText,要求用户选择秒数来触发警报):
public void startAlarm(View view) {
EditText E1 = (EditText) findViewById(R.id.et1);
int i = Integer.parseInt(E1.getText().toString());
Intent intent = new Intent(this, AlarmBroadcastReceiver.class);
PendingIntent pending_intent =
PendingIntent.getBroadcast(this.getApplicationContext(),
98989898, intent, 0); // 98989898 : some big number
AlarmManager alarmManager = (AlarmManager)
getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + i*1000, pending_intent);
Toast.makeText(this, "Alarm set in: " + i + " seconds",
Toast.LENGTH_LONG).show();
}
警报由 alarmBroadcastReceiver 接收。它自己什么都不做,它立即转移到 UserResponseActivity:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class AlarmBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// We're creating a new intent that's going to start the UserResponseActivity
Intent in = new Intent(context, UserResponseActivity.class);
// This boolean just makes it easier to check if the Activity has been started from
// this class
in.putExtra("lock", true);
// You need to add this to your intent if you want to start an Activity fromm a class
// that is not an Activity itself
in.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Now we just start the Activity
context.startActivity(in);
}
}
然后 UserResponseActivity 是一个普通的 activity,目前具有来自 Android Studio 的样板屏幕。稍后我计划添加一些代码来请求用户的响应。创建后,它显示祝酒词并在短时间内激活振动器:
import android.content.Context;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Toast;
public class UserResponseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_response);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
/* Show a success toast*/
Toast.makeText(this, "Alarm Started", Toast.LENGTH_LONG).show();
/* Vibrate shortly */
Vibrator vibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(200);
}
}
如果您需要,这里是我的清单中启用警报接收器和振动器服务的代码行:
<uses-permission android:name="android.permission.VIBRATE" />
<receiver android:name=".AlarmBroadcastReceiver" />
如前所述,如果在 phone 唤醒时触发警报,则一切正常:UserResponseActivity 显示在屏幕上并且振动器关闭。
但是,如果在 phone 睡眠时触发警报,振动器将关闭(因此 phone 被唤醒并调用 UserResponseActivity)但屏幕保持黑色。当我随后打开 phone 时,UserResponseActivity 就在上面。
我需要做什么才能UserResponseActivity
打开屏幕?
谢谢!
已添加(在 VicJordan 回复后):
@VicJordan:我将你的代码粘贴到 UserResponseActivity.java 的 onCreate 中,如下所示,但是出现了两个错误,我无法找出我在这两行中做错了什么:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
activity.setTurnScreenOn(true);
a) Android Studio 无法解析符号 'O_MR1'
b) 它可以在第二行解析 'activity' 。我认为将 activity 更改为 'this' 可以解决问题,但事实并非如此。我真的想不出另一种方式来引用 activity 我在
public class UserResponseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_response);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
// Turn on the screen
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
activity.setTurnScreenOn(true);
} else {
final Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
/* Show a success toast*/
Toast.makeText(this, "Alarm Started", Toast.LENGTH_LONG).show();
/* Vibrate shortly */
Vibrator vibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(200);
}
您有什么建议吗?谢谢!
要在 Activity 中打开屏幕,您可以从 API 27 级开始使用 WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON but FLAG_TURN_SCREEN_ON
flag has been deprecated in API level 27 so you can use Activity.setTurnScreenOn(true)。
代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
this.setTurnScreenOn(true);
} else {
final Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
查看此官方信息以获取更多信息:https://developer.android.com/training/scheduling/wakelock
我正在设置一个关于如何对 Android 中的警报做出反应的骨架应用程序。当 phone 唤醒时一切正常,当 phone 睡眠时警报触发(我什至可以激活振动器)但屏幕保持关闭状态(完全黑)。我无法解释为什么。欢迎任何帮助!
这是 MainActivity 中设置 alarmManager 的代码片段(E1 是一个 EditText,要求用户选择秒数来触发警报):
public void startAlarm(View view) {
EditText E1 = (EditText) findViewById(R.id.et1);
int i = Integer.parseInt(E1.getText().toString());
Intent intent = new Intent(this, AlarmBroadcastReceiver.class);
PendingIntent pending_intent =
PendingIntent.getBroadcast(this.getApplicationContext(),
98989898, intent, 0); // 98989898 : some big number
AlarmManager alarmManager = (AlarmManager)
getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + i*1000, pending_intent);
Toast.makeText(this, "Alarm set in: " + i + " seconds",
Toast.LENGTH_LONG).show();
}
警报由 alarmBroadcastReceiver 接收。它自己什么都不做,它立即转移到 UserResponseActivity:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class AlarmBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// We're creating a new intent that's going to start the UserResponseActivity
Intent in = new Intent(context, UserResponseActivity.class);
// This boolean just makes it easier to check if the Activity has been started from
// this class
in.putExtra("lock", true);
// You need to add this to your intent if you want to start an Activity fromm a class
// that is not an Activity itself
in.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Now we just start the Activity
context.startActivity(in);
}
}
然后 UserResponseActivity 是一个普通的 activity,目前具有来自 Android Studio 的样板屏幕。稍后我计划添加一些代码来请求用户的响应。创建后,它显示祝酒词并在短时间内激活振动器:
import android.content.Context;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Toast;
public class UserResponseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_response);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
/* Show a success toast*/
Toast.makeText(this, "Alarm Started", Toast.LENGTH_LONG).show();
/* Vibrate shortly */
Vibrator vibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(200);
}
}
如果您需要,这里是我的清单中启用警报接收器和振动器服务的代码行:
<uses-permission android:name="android.permission.VIBRATE" />
<receiver android:name=".AlarmBroadcastReceiver" />
如前所述,如果在 phone 唤醒时触发警报,则一切正常:UserResponseActivity 显示在屏幕上并且振动器关闭。 但是,如果在 phone 睡眠时触发警报,振动器将关闭(因此 phone 被唤醒并调用 UserResponseActivity)但屏幕保持黑色。当我随后打开 phone 时,UserResponseActivity 就在上面。
我需要做什么才能UserResponseActivity
打开屏幕?
谢谢!
已添加(在 VicJordan 回复后):
@VicJordan:我将你的代码粘贴到 UserResponseActivity.java 的 onCreate 中,如下所示,但是出现了两个错误,我无法找出我在这两行中做错了什么:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
activity.setTurnScreenOn(true);
a) Android Studio 无法解析符号 'O_MR1' b) 它可以在第二行解析 'activity' 。我认为将 activity 更改为 'this' 可以解决问题,但事实并非如此。我真的想不出另一种方式来引用 activity 我在
public class UserResponseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_response);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
// Turn on the screen
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
activity.setTurnScreenOn(true);
} else {
final Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
/* Show a success toast*/
Toast.makeText(this, "Alarm Started", Toast.LENGTH_LONG).show();
/* Vibrate shortly */
Vibrator vibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(200);
}
您有什么建议吗?谢谢!
要在 Activity 中打开屏幕,您可以从 API 27 级开始使用 WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON but FLAG_TURN_SCREEN_ON
flag has been deprecated in API level 27 so you can use Activity.setTurnScreenOn(true)。
代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
this.setTurnScreenOn(true);
} else {
final Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
查看此官方信息以获取更多信息:https://developer.android.com/training/scheduling/wakelock