gpt4 book ai didi

android - 在设定的时间将应用程序从 sleep 中唤醒

转载 作者:太空狗 更新时间:2023-10-29 16:06:19 28 4
gpt4 key购买 nike

我想让我的应用进入休眠状态,然后在设定的时间唤醒它。我让它 sleep 但不醒来。

这会设置唤醒锁:

private void setWakeLock(){
System.out.println("wakelock");
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP
| PowerManager.ON_AFTER_RELEASE, "DoNotDimScreen");
wl.acquire();
}

这会设置唤醒/ sleep 时间的闹钟:

private void setWakeSleep(){
java.util.Calendar c = java.util.Calendar.getInstance();
c.set(java.util.Calendar.HOUR_OF_DAY, 17);
c.set(java.util.Calendar.MINUTE, 53);
c.set(java.util.Calendar.MILLISECOND, 0);
Intent sleepIntent = new Intent("SLEEP_INTENT");
PendingIntent sleepPendingIntent = PendingIntent.getBroadcast(this, 0, sleepIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), sleepPendingIntent);

c.set(java.util.Calendar.HOUR_OF_DAY, 18);
c.set(java.util.Calendar.MINUTE, 14);
c.set(java.util.Calendar.MILLISECOND, 0);
Intent wakeIntent = new Intent("WAKE_INTENT");
PendingIntent wakePendingIntent = PendingIntent.getBroadcast(this, 0, wakeIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager2 = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager2.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), wakePendingIntent);
}

这是广播接收器:

private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Time updateHour = new Time();
updateHour.set(System.currentTimeMillis());
if (intent.getAction().equals("SLEEP_INTENT")) {
System.out.println("sleep");
wl.release();
}
if (intent.getAction().equals("WAKE_INTENT")) {
wl.acquire();
System.out.println("wake");
//initialise();
}
}
};

非常感谢任何帮助!

最佳答案

首先,您不需要唤醒锁;这些是为了防止设备进入休眠状态,这是高度反社会的,除非您的应用确实需要它(它会耗尽电池)。

其次,如果您在 18:14 之后调用设置唤醒时间的代码将会失败,因为您现在将定义过去的时间。让我们暂时忽略它。

接下来,您的 Intent 操作应该类似于“org.user1797190.WAKE_INTENT”,而不是可能导致冲突的简单“WAKE_INTENT”。如果您希望公开此 Intent ,请考虑在 http://openintents.org 进行注册。 .不过,这也不是您的问题。

您不需要 alarmManager2 -- 系统中只有一个警报管理器,因此只需重新使用第一个。

我从未听说过让应用程序本身进入“ sleep ”状态。您的意思是您希望应用程序消失,然后再回来吗?

这是我会做的。完全忘记“SLEEP_INTENT”。只需安排一个“WAKE_INTENT”,然后调用 finish()。您的应用将直接离开屏幕。

我会完全忘记广播接收器。相反,我会使用 getActivity() 而不是 getBroadcast() 来获取将重新启动 Activity 的未决 Intent 。修改您的 list ,以便您的 WAKE_INTENT 将进入 Activity 。此外,您应该将“android:launchMode”属性设置为“singleTask”,这样就不会创建 Activity 的多个实例。如果您的 Activity 在到达时已经在运行,您还需要实现 onNewIntent() 来处理唤醒 Intent 。

最后,如果您的 Activity 是将创建 Intent 的同一应用程序的一部分,则您根本不需要命名 Intent;你可以按类创建它们。不过,您需要另一种方式让接收者知道这是一个唤醒 Intent 。

所以,把它们放在一起:

您的 list 应包含:

<activity android:name=".TestActivity" android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

您的代码应包含:

/**
* Arrange for the activity to return at a specific time.
* Call finish() after calling this method().
* This function can be called from anywhere that has a valid Context.
*/
public static void scheduleWakeup(Context ctx, long timeMillis) {
if (DEBUG) Log.d(TAG, "Scheduling wakeup for " + timeMillis);
Intent intent = new Intent(ctx, TestActivity.class);
intent.putExtra("wakeup", true);
PendingIntent pi = PendingIntent.getActivity(ctx, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager mgr = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
mgr.cancel(pi); // Cancel any previously-scheduled wakeups
mgr.set(AlarmManager.RTC_WAKEUP, timeMillis, pi);
}

...

protected void onCreate(Bundle state) {
Intent intent = getIntent();
if (intent.getBooleanExtra("wakeup", false)) {
// We were woken up by the alarm manager
}
...
}

protected void onNewIntent(Intent intent) {
if (intent.getBooleanExtra("wakeup", false)) {
// We were woken up by the alarm manager, but were already running
}
}

这与我在自己的应用程序中所做的非常接近,而且对我来说效果很好。

当然,您必须自己测试一下。 Log.d() 是你的 friend 。

关于android - 在设定的时间将应用程序从 sleep 中唤醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13689330/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com