Разбудить устройство, когда приложение предлагает пользователю - PullRequest
3 голосов
/ 23 июня 2011

Я использую обработчик для многократного запроса пользователя о вводе каждые, например, 5 минут.Когда устройство переходит в спящий режим и экран заблокирован, как я могу разбудить устройство, когда мое приложение запрашивает ввод данных пользователем?Я пробовал это, но это не похоже на работу.Я добавил разрешение WAKE_LOCK в манифест.

class BtHandler extends Handler {
    private PowerManager pm;
    private WakeLock wl;

    @Override
    public void handleMessage(Message msg) {
        pm = (PowerManager)FixedNode.this.getSystemService(Context.POWER_SERVICE);
        if (!pm.isScreenOn()) {
            wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "TAG");
            wl.acquire();
        }
        FixedNode.this.setAlwaysDiscoverable();
        wl.release();
    }
}

Есть идеи?

Редактировать: Использование AlarmManager для трансляции пользовательских намерений.

mReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        v.vibrate(300);
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        WakeLock wl = null;

        if (!pm.isScreenOn()) {
            KeyguardLock kl = km.newKeyguardLock("TAG");
            kl.disableKeyguard();
            wl = pm.newWakeLock(
                PowerManager.SCREEN_BRIGHT_WAKE_LOCK | 
                PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
            wl.acquire();
        }

        Toast.makeText(context, "Alarm worked", Toast.LENGTH_LONG).show();
        wl.release();
    }
};

mFilter = new IntentFilter(ACTION_NAME);

Intent mIntent = new Intent(ACTION_NAME);        
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, mIntent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (120 * 1000), pendingIntent);
Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();

Ответы [ 3 ]

4 голосов
/ 23 июня 2011

Обычно wakelock не актуально включает экран.Таким образом, вы должны получить блокировку wake с

ACQUIRE_CAUSES_WAKEUP

в качестве дополнительного флага.

3 голосов
/ 23 июня 2011

Посмотрите на класс AlarmManager http://developer.android.com/reference/android/app/AlarmManager.html Это что-то вроде "cron"

Хорошо, вот фрагмент рабочего кода - сначала идет класс активности:

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;

public class MainActivity extends Activity {
    private WakeLock wl;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //acquire wake lock
        PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
        wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "TAG");
        wl.acquire();

        // schedule alarm
        Intent i = new Intent();
        i.setAction(WakeReciever.WAKE_INTENT);
        PendingIntent pIntent = PendingIntent.getBroadcast(this, 0, i, 0);

        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 120000,
                pIntent);
    }

    @Override
    protected void onPause() {
        wl.release();
        super.onPause();
    }

}

Далее идет BroadcastReceiver:

package com.test;

import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;

public class WakeReciever extends BroadcastReceiver {
    public static final String WAKE_INTENT = "com.test.WAKE"; 


    /**
     * @see android.content.BroadcastReceiver#onReceive(Context,Intent)
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        //acquire wake lock

        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
        wl.acquire();


        //start activity
        Intent i = new Intent();
        i.setClassName("com.test", "com.test.MainActivity");
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        context.startActivity(i);

        wl.release();
    }
}

И, наконец, не забудьте о файле манифеста:

<?xml version="1.0" encoding="UTF-8"?>
<manifest android:versionCode="1" android:versionName="1.0"
    package="com.test" xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-sdk android:minSdkVersion="8"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:label="@string/app_name" android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <receiver android:name=".WakeReciever" android:enabled="true">
            <intent-filter>
                <action android:name="com.test.WAKE"></action>
            </intent-filter>
        </receiver>

    </application>
</manifest>
0 голосов
/ 30 января 2015

Из того, что я вижу, вы снимаете блокировку сразу после ее приобретения.Вот почему это создает впечатление не работает.Удалите это и поместите это где-нибудь еще вне метода, который получает это.

mReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        v.vibrate(300);
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        WakeLock wl = null;

        if (!pm.isScreenOn()) {
            KeyguardLock kl = km.newKeyguardLock("TAG");
            kl.disableKeyguard();
            wl = pm.newWakeLock(
                PowerManager.SCREEN_BRIGHT_WAKE_LOCK | 
                PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
            wl.acquire();
        }

        Toast.makeText(context, "Alarm worked", Toast.LENGTH_LONG).show();
    }
};
...