我正在尝试通过闹钟开始一项活动。PendingIntent 启动接收器,接收器启动活动。我目前的问题是活动在后台开始,无法听到警报声。Oreo 和更新的设备不推荐使用旧 SO 问题中的大多数标志。有没有人有一个很好的方法来处理这个问题?
先感谢您
报警创建:
alarmManager.setExact(AlarmManager.RTC_WAKEUP, intervalFinished, pendingIntent)
Run Code Online (Sandbox Code Playgroud)
接收者
class OnAlarmReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val intent = Intent(context, AlarmActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent)
}
}
Run Code Online (Sandbox Code Playgroud)
活动:
private var wake: PowerManager.WakeLock? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
wake = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK
or PowerManager.ACQUIRE_CAUSES_WAKEUP, "App:wakeuptag")
wake?.acquire(10*60*1000L /*10 minutes*/)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true)
setTurnScreenOn(true)
} else {
window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
or WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
or WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
or WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON)
} …Run Code Online (Sandbox Code Playgroud) 我正在使用GCM为我的项目提供推送通知,但我被困在获取唤醒锁定.
日志消息:
09-03 17:04:05.003: V/GCMBroadcastReceiver(5772): onReceive:com.google.android.c2dm.intent.REGISTRATION
09-03 17:04:05.003: V/GCMBroadcastReceiver(5772): GCM IntentService class: example.pro.GCMIntentService
09-03 17:04:05.049: V/GCMBaseIntentService(5772): Acquiring wakelock
Run Code Online (Sandbox Code Playgroud)
以下是我的清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="example.pro"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- Creates a custom permission so only this app can receive …Run Code Online (Sandbox Code Playgroud) android push-notification android-wake-lock google-cloud-messaging
我必须制作一个使用唤醒锁保持屏幕打开的应用程序。我有两个按钮,一个用于打开唤醒锁,一个用于关闭它。
打开唤醒锁的按钮工作正常,但关闭唤醒锁的按钮会导致应用程序崩溃。
这是代码:
public class MainActivity extends ActionBarActivity {
@Override @SuppressWarnings("deprecation")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupScreenONButton();
setupScreenOFFButton();
}
@SuppressWarnings("deprecation")
private void setupScreenOFFButton() {
Button ScreenOffButton = (Button) findViewById(R.id.buttonScreenOFF);
ScreenOffButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"Screen OFF");
wl.release();
Toast.makeText(MainActivity.this, "Screen OFF", Toast.LENGTH_SHORT).show();
}
});
}
@SuppressWarnings("deprecation")
private void setupScreenONButton() {
Button ScreenOnButton = (Button) findViewById(R.id.buttonScreenON);
ScreenOnButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
PowerManager pm = …Run Code Online (Sandbox Code Playgroud) 我正在开发一个原生的Android应用程序,每30分钟运行一次操作.我需要确保处理器正在运行,所以我使用了
警报接收器内的PowerManager.Wakelock.
这是我在警报接收器里面使用的代码.
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent arg1) {
PowerManager pm = (PowerManager) context.getSystemService(context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
wl.acquire();
Intent eventService = new Intent(context, SyncInBackground.class);
context.startService(eventService);
wl.release();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的主AndroidManifest.xml中
我添加了以下行来请求权限
<uses-permission android:name="android.permission.wake_lock"/>
Run Code Online (Sandbox Code Playgroud)
当我在我的应用程序中运行警报时,我得到以下异常
02-07 23:25:02.839 13699-13699/com.snappext E/AndroidRuntime? FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start receiver com.snappext.Backup.AlarmReceiver: java.lang.SecurityException: Neither user 10008 nor current process has android.permission.WAKE_LOCK.
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2140)
at android.app.ActivityThread.access$1500(ActivityThread.java:127)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1211)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4512)
at java.lang.reflect.Method.invokeNative(Native …Run Code Online (Sandbox Code Playgroud) 我的申请中有一些活动.在主要活动中,我定义了唤醒锁定:
PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Lock");
Run Code Online (Sandbox Code Playgroud)
并以onPause()方法发布.我的问题是,它在整个应用程序中是否活跃?或者我是否需要在每次活动中复制/粘贴它?
谢谢
我最近重建了应用程序的电源管理部分以降低复杂性.其中的变化是重复使用唤醒锁; 具体而言,线程在创建时接收唤醒锁,然后根据需要获取/释放它直到被杀死.我发现这会导致唤醒锁release()被调用时并不总是释放.导致问题的代码在本质上是在这里给出的:
// Get the lock for the first time, acquire it, and do some work.
WakeLock wakelock = receiveFirstWakeLock();
wakelock.acquire();
doWork();
// When work is finished, release the lock.
// Typically this lock is released very quickly.
wakelock.release();
// Re-acquiring the lock for the next bout of work always works.
wakelock.acquire();
doWork();
// In my full code, "wakelock" didn't appear to be releasing properly.
// I hypothesized that it might just be taking a little while
// …Run Code Online (Sandbox Code Playgroud) FusedLocationProvider即使屏幕关闭,我也想让我为位置ping.为此,在我的服务中,我有一个PARTIAL_WAKE_LOCK,以保持CPU运行,并确保即使屏幕关闭,服务仍继续运行.
话虽如此,我知道Android OS会在需要内存时在后台扼杀服务/应用程序.因此,我的服务可以被杀掉.
发生这种情况时,onDestroy()在Service不能保证被调用.如果是这种情况,我如何确保WakeLock被释放?
我打电话mWakeLock.acquire();的onStartCommand,和onDestroy我打电话mWakeLock.release();
我从这个链接一直在研究WakefulBroadcastReceiver:https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html
关于此,我几乎没有什么困惑:
代码:
import android.app.IntentService;
import android.content.Intent;
import android.os.SystemClock;
import android.util.Log;
public class SimpleWakefulService extends IntentService {
public SimpleWakefulService() {
super("SimpleWakefulService");
}
@Override
protected void onHandleIntent(Intent intent) {
// At this point SimpleWakefulReceiver is still holding a wake lock
// for us. We can do whatever we need to here and then tell it that
// it can release the wakelock. This sample just does some slow work,
// but more complicated implementations could take …Run Code Online (Sandbox Code Playgroud) 我希望为我的应用程序的用户提供使用a保持屏幕的能力WakeLock.在我的主要活动中,我创建了以下函数:
protected void processWakeLock(int pauseResume) {
switch (pauseResume) {
case STATE_RESUME:
if (mKeepScreenOn) {
wakeLock.acquire();
}
break;
case STATE_PAUSE:
if (wakeLock.isHeld()) {
wakeLock.release();
}
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我目前正在通过我的覆盖onPause和onResume覆盖来调用它,因为我希望确保在他们不主动使用我的应用程序时不会导致用户手机上的锁定.我的应用程序有3个其他全屏视图.什么是确保他们可以WakeLock继续使用我的应用程序的所有部分同时仍然对其余手机安全的最佳方法.
我的第一个想法是在我的每个活动中复制相同的代码片段,虽然这似乎是很多锅炉板.我无法使用onStart,onStop因为当我切换到另一个全屏幕活动时,可见性会丢失.虽然也许会更好
基于此处的图表和信息(http://developer.android.com/guide/topics/fundamentals.html),我没有看到更好的方法来应用锁定.