7

BroadcastReceiver開始するがありActivityます。Activity画面がオンのときにを起動すると、が表示され、すべて正常です。ただし、ICSおよびJBデバイス(GBまたはHCはテストしていませんが、Froyoには問題はありません)でActivity、画面がオフのときに起動すると、ロック画面が無効にならず、アクティビティが表示されない場合電話のロックが解除されます(手動でロックを解除するか、フローズンヨーグルト後のデバイス用に入力したコードを使用してロックを解除します)。

少なくともICSおよびJBデバイスで、以下のコードがないとロック画面が無効にならないのはなぜですか。また、Activity起動時に画面がオフだった場合にアクティビティが表示されないのはなぜですか。

コードは次のとおりです。

BroadcastReceiver

Intent alarmAlert = new Intent(context, AlarmGoneOffActivity.class);
alarmAlert.putExtra(MyAlarmManager.ALARM_NUM_ID, alarm.ID);
alarmAlert.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
                    Intent.FLAG_ACTIVITY_NO_USER_ACTION);
context.startActivity(alarmAlert);

AlarmGoneOffActivity.onCreate()

setContentView(R.layout.alarm_gone_off);

final Window win = getWindow();
win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | 
             WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
             WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
             WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
             WindowManager.LayoutParams.FLAG_FULLSCREEN | 
             WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
             WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
             WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}

//so far all of my post froyo devices (ICS and JB no more GB)
// don't bypass the lockscreen unless we use this
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) {
    KeyguardManager  myKeyGuard = 
                    (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
    KeyguardLock myLock = myKeyGuard.newKeyguardLock("ShabbosAlarm");
    myLock.disableKeyguard();
}

編集:KeyguardLock.disableKeyguard()不便になるまでキーガードが無効になるので、私は本当に使用したくないKeyguardLock.reenableKeyguard()です。解決策はありますか?

Edit2:問題がICS以降にのみ存在することを確認できるようになりました。キーガードが無効になるのを防ぐ何かが変更されましたか?そして、あったとしても、Activity手動で画面のロックを解除したときに表示されないのはなぜですか?

4

2 に答える 2

3

これを実現するために使用した基本的な実装は次のとおりです。2.3から4.3までの私のユーザーのために働いています。あなたはここからそれを構築することができると私は確信しています。このイベントを処理するためだけに、この非常に短期間のアクティビティを作成しました。必要に応じて、ヘルパークラスとして使用できます。

import android.app.Activity;
import android.os.Bundle;
import android.view.WindowManager;

public class BlankActivity extends Activity {

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
                WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);


        // Your code here - Or if it doesn't trigger, see below
    }

    @Override
    public void onAttachedToWindow() {

        // You may need to execute your code here

    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {

        }
    }

    @Override
    public void onPause() {
        super.onPause();

        finish();
    }
}

そしてマニフェストで:

    <activity
        android:name="com.your.package.BlankActivity"
        android:clearTaskOnLaunch="true"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:excludeFromRecents="true"
        android:launchMode="singleInstance"
        android:noHistory="true"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" >
    </activity>

他の関連する投稿とは異なり、半透明のテーマは問題を引き起こしませんでした。また、アクティビティにレイアウトを追加する必要もありませんでした。

それがあなたにもうまくいくことを願っています。

于 2013-08-22T16:49:56.630 に答える
0

このコードは私のために働きます。これをOnCreateアクティビティに入れます

private fun wakeScreen() {
    val window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
}

そして、活動マニフェストにこれを置きました

<activity android:name=".Alarm.AlarmNotifActivity"
        android:showOnLockScreen="true"
        android:showWhenLocked="true"
        android:launchMode="singleInstance"/>

お役に立てば幸いです。

于 2020-03-01T15:28:42.313 に答える