屏幕锁定时重复从服务启动活动时出现问题
Issue when Repeatedly Starting Activities from Service while screen is locked
我有两个服务 "home" 和 "alert"。家庭服务会扫描附近的蓝牙设备以查找号码(1、2 或 3)。警报服务扫描蓝牙以查找 0。
当扫描到 1、2 或 3 时,主服务停止,并启动新的 activity,具体取决于数字。警报服务已启动。
读取 0 时,警报服务停止,returns 用户到主 activity。家庭服务重新启动。
我的问题每次都会发生,当我尝试从 phone 被锁定后第二次启动警报时,activity 不会启动。请查看下面的列表,以便您进一步了解。
1- Home Service 和 mainActivity 运行 在后台 phone 锁定
2- 蓝牙读入 1
3- 主页服务已停止,警报服务已启动,警报屏幕 1 activity 已启动
4- 警报服务读入 0
5- 警报服务已停止,主页服务已启动,mainActivity activity 已启动
6- 家庭服务读取 1
7- 主页服务停止,警告屏幕 1 activity 将不会启动
如果我在锁定屏幕上启动 activity 后解锁 phone,phone 也不会启动 activity。之后我可以启动警报屏幕活动 2 或 3,但不能启动警报屏幕 1。
如果我 运行 我的应用程序解锁屏幕,一切正常。
警报屏幕 1 Activity 的 onCreate
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
setContentView(R.layout.activity_yellow_flash);
家庭服务onStartCommand
该服务已启动,但线程完成所有工作。当线程扫描到一个值为 1 时,我调用一个方法来启动一个新的 activity。此方法最后一行中断线程,进而停止服务。
@Override
public int onStartCommand(Intent intent, int flags, int startID){
Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
Intent notifyIntent = new Intent(this, MainActivity.class);
PendingIntent PI = PendingIntent.getActivity(this, 0, notifyIntent, 0);
Notification notification = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.notify_lockout)
.setContentTitle("Lockout Application")
.setContentText("Running Services...")
.setContentIntent(PI).build();
Random random = new Random();
int notificationID = random.nextInt(9999 - 1000) + 1000;
startForeground(notificationID, notification);
// Start Thread
thread = new Thread(new Threader(startID));
thread.start();
return START_STICKY;
}
线程调用startActivity()方法,看起来像:
startAssistanceAlertActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startAssistanceAlertActivity);
Log.e("Test", "Called startActivity");
在 activity 启动失败期间,测试日志在 logcat 中可见。所以,我只是想知道为什么 activity 会启动一次,但再也不会启动,无论我解锁 phone.
对此有什么想法吗?如果您想查看一些特定代码,请告诉我。
识别问题:
您第一次使用 startActivity()
开始 Alert Screen 1 activity
,它的工作也 activity 添加到堆栈中。
如果您再次尝试启动它,它不会出现。
为什么会这样?
第一次使用 startActivity()
会弹出 activity 因为它不在堆栈中,第二次它只会被添加到堆栈顶部,因此如果您尝试午餐图标中的应用程序,它将显示此 activity.
解法:
每次启动其他服务或在启动时使用 Intent.FLAG_ACTIVITY_CLEAR_TASK
时从堆栈中清除它 activity。
我有两个服务 "home" 和 "alert"。家庭服务会扫描附近的蓝牙设备以查找号码(1、2 或 3)。警报服务扫描蓝牙以查找 0。
当扫描到 1、2 或 3 时,主服务停止,并启动新的 activity,具体取决于数字。警报服务已启动。
读取 0 时,警报服务停止,returns 用户到主 activity。家庭服务重新启动。
我的问题每次都会发生,当我尝试从 phone 被锁定后第二次启动警报时,activity 不会启动。请查看下面的列表,以便您进一步了解。
1- Home Service 和 mainActivity 运行 在后台 phone 锁定
2- 蓝牙读入 1
3- 主页服务已停止,警报服务已启动,警报屏幕 1 activity 已启动
4- 警报服务读入 0
5- 警报服务已停止,主页服务已启动,mainActivity activity 已启动
6- 家庭服务读取 1
7- 主页服务停止,警告屏幕 1 activity 将不会启动
如果我在锁定屏幕上启动 activity 后解锁 phone,phone 也不会启动 activity。之后我可以启动警报屏幕活动 2 或 3,但不能启动警报屏幕 1。
如果我 运行 我的应用程序解锁屏幕,一切正常。
警报屏幕 1 Activity 的 onCreate
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
setContentView(R.layout.activity_yellow_flash);
家庭服务onStartCommand 该服务已启动,但线程完成所有工作。当线程扫描到一个值为 1 时,我调用一个方法来启动一个新的 activity。此方法最后一行中断线程,进而停止服务。
@Override
public int onStartCommand(Intent intent, int flags, int startID){
Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
Intent notifyIntent = new Intent(this, MainActivity.class);
PendingIntent PI = PendingIntent.getActivity(this, 0, notifyIntent, 0);
Notification notification = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.notify_lockout)
.setContentTitle("Lockout Application")
.setContentText("Running Services...")
.setContentIntent(PI).build();
Random random = new Random();
int notificationID = random.nextInt(9999 - 1000) + 1000;
startForeground(notificationID, notification);
// Start Thread
thread = new Thread(new Threader(startID));
thread.start();
return START_STICKY;
}
线程调用startActivity()方法,看起来像:
startAssistanceAlertActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startAssistanceAlertActivity);
Log.e("Test", "Called startActivity");
在 activity 启动失败期间,测试日志在 logcat 中可见。所以,我只是想知道为什么 activity 会启动一次,但再也不会启动,无论我解锁 phone.
对此有什么想法吗?如果您想查看一些特定代码,请告诉我。
识别问题:
您第一次使用 startActivity()
开始 Alert Screen 1 activity
,它的工作也 activity 添加到堆栈中。
如果您再次尝试启动它,它不会出现。
为什么会这样?
第一次使用 startActivity()
会弹出 activity 因为它不在堆栈中,第二次它只会被添加到堆栈顶部,因此如果您尝试午餐图标中的应用程序,它将显示此 activity.
解法:
每次启动其他服务或在启动时使用 Intent.FLAG_ACTIVITY_CLEAR_TASK
时从堆栈中清除它 activity。