手机睡着时无法显示活动(警报)

Posted

技术标签:

【中文标题】手机睡着时无法显示活动(警报)【英文标题】:Unable to display activity(alarm) when phone is asleep 【发布时间】:2014-07-14 10:14:15 【问题描述】:

我已经阅读了很多关于此的答案,但仍然无法找到解决方法。

我有一个应用程序,它为会议设置提醒,并在约会前 15 分钟显示一个弹出活动,并从用户那里获得有关约会的输入。

我使用 AlarmManager 来设置警报,并从广播接收器启动一个活动。设备打开时工作正常,但如果它是睡眠它不会打开我的手机(但是我确实设法在我的模拟器上打开锁定屏幕)。在任何一种情况下,如果用户不手动解锁手机,我都无法解锁手机并显示我的活动。

我的主要活动

public class Start extends Activity 

public static int no;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_start);
    System.out.println("On create. After content set.");
    LinearLayout l =  (LinearLayout) findViewById(R.id.startlayout);
    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, new GregorianCalendar().getTimeInMillis()+10000, PendingIntent.getBroadcast(this, 0, new Intent(this, AlarmReciever.class), Intent.FLAG_ACTIVITY_NEW_TASK));



我的广播接收器

public class AlarmReciever extends BroadcastReceiver 


@Override
public void onReceive(Context arg0, Intent arg1) 
    Log.i("Alarm recieved", "Executing on receive");
    PowerManager pm = (PowerManager)arg0.getSystemService(Context.POWER_SERVICE);
    WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Tag");
    wl.acquire();
    Intent i = new Intent();
    i.setClassName("com.example.attendogram", "com.example.attendogram.Reminder");
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    arg0.startActivity(i);
    Log.i("Alarm recieved", "Executed on receive");




广播接收器启动的活动

public class Reminder extends Activity 

private Context context;


public Reminder() 
    // TODO Auto-generated constructor stub


@Override
protected void onCreate(Bundle savedInstanceState) 
    // TODO Auto-generated method stub

    Log.i("Reminder created", "Executing onCreate");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.reminder);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    Log.i("Reminder", "Screen tunred on");
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    Log.i("Reminder", "Dismissed");
    setFinishOnTouchOutside(false);
    TextView rem = (TextView) findViewById(R.id.reminder_sna);
    rem.setText(getIntent().getStringExtra("id"));
    context = this;

还有我的清单

<?xml version="1.0" encoding="utf-8"?>   

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.attendogram"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="18" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.attendogram.Start"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="SubPage"></activity>
    <activity android:name="NewSub"></activity>
    <activity android:name="Timetable" >
    </activity>
    <receiver android:name=".AlarmReciever" />
    <activity
        android:name="Reminder"
        android:theme="@android:style/Theme.DeviceDefault.Dialog.NoActionBar.MinWidth"
        android:excludeFromRecents="true" >
    </activity>
</application>

</manifest>

【问题讨论】:

【参考方案1】:

如果手机一直处于休眠状态,您的手机只会在执行广播接收器的时间唤醒。 Activity 执行时,它可能保持唤醒状态,也可能不保持唤醒状态。

要解决这个问题,您应该在接收器本身中获取唤醒锁,然后启动活动...

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
               PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);

        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, App.TAG);

                wl.acquire();  
Log.i("Alarm recieved", "Executing on receive");
                Intent i = new Intent();
                i.setClassName("com.example.attendogram", "com.example.attendogram.Reminder");
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                arg0.startActivity(i);

【讨论】:

嗨,这段代码甚至没有像我在开始的活动中使用唤醒锁时那样打开我的模拟器。日志猫显示正在执行广播和接收活动中的所有代码。有什么我遗漏的吗(我已经添加了所需的权限) 上述标志本身不会唤醒屏幕。我必须使用 getwindow().addflags() 来唤醒屏幕。但我的 'DISMISS_KEYGAURD' 仍然无法正常工作。发布我的课程和清单会帮助您更好地理解吗? 是的,如果可能的话,把项目发给我 我已将相关类和我的清单添加到之前的帖子中。请检查一下,自上次以来没有太大变化。

以上是关于手机睡着时无法显示活动(警报)的主要内容,如果未能解决你的问题,请参考以下文章

Android 在右下角显示警报对话框,并在显示时使用活动

在IOS中显示警报时,键盘不会从View中退出

SwiftUI MapKit UIViewRepresentable 无法显示警报

将警报对话框的部分文本链接到一个活动。

显示警报时从窗口警报中删除警报文本

使用 mvvmcross 显示视图模型时无法解析当前的***活动