首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >警报后活动触发器(RTC_WAKEUP),但屏幕仍然是黑色的

警报后活动触发器(RTC_WAKEUP),但屏幕仍然是黑色的
EN

Stack Overflow用户
提问于 2018-06-17 17:25:32
回答 1查看 707关注 0票数 2

我正在设置一个框架应用程序,讨论如何在Android中对警报做出反应。当手机醒着的时候,一切正常工作,当手机睡着的时候,警报会触发(我甚至可以激活振子),但是屏幕保持不动(完全是黑色的)。我不知道为什么。欢迎任何帮助!

这是MainActivity中设置alarmManager的代码片段(E1是一个EditText,用于要求用户选择秒来触发警报):

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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是一个正常的活动,目前有来自Android的样板屏幕。稍后,我计划添加一些代码,请求用户的响应。在造物时,它展示一个祝酒词,并在短时间内激活振动器:

代码语言:javascript
运行
复制
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);
    }

}

如果您需要它,下面是我清单中启用警报接收器和振动器服务的代码行:

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.VIBRATE" />

<receiver android:name=".AlarmBroadcastReceiver" />

正如前面提到的,如果当手机处于清醒状态时,所有的警报都能正常工作: UserResponseActivity显示在屏幕上,振动器启动。然而,如果当手机睡着时警报触发,振动器就会响(因此手机被唤醒,UserResponseActivity被呼叫),但是屏幕仍然是黑色的。当我随后打开电话时,UserResponseActivity就在上面。

为了让UserResponseActivity打开屏幕,我需要做什么?

谢谢!

添加(在VicJordan的答复后):

@VicJordan:我将您的代码粘贴到onCreate of UserResponseActivity.java中,如下所示,但是得到了两个错误,我无法找出我在这2行代码中做错了什么:

代码语言:javascript
运行
复制
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
        activity.setTurnScreenOn(true);

( a) Android不能解析符号'O_MR1‘b)它可以在第2行解析'activity’。我以为为“这”而改变活动会起作用,但不行。我真的想不出其他方法来引用我所从事的活动

代码语言:javascript
运行
复制
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);
    }

你有什么建议吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-22 01:06:21

要在您的活动中打开屏幕,您可以使用在……上面,但是在API 27中已经不推荐使用FLAG_TURN_SCREEN_ON标志,所以您可以从API 27开始使用Activity.setTurnScreenOn(真)

以下是代码:

代码语言:javascript
运行
复制
    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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50898909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档