11

画面がロックされているときに、C2DM の着信通知を受信して​​います。アクティビティを使用して画面を起動し、ロック画面の上に通知メッセージを表示したいと思います。次のように、C2DM BroadcastReceiver から通知アクティビティを起動しています。

Intent new_intent= new Intent().setClass( context, EIAlertDialog.class );           
new_intent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );      
new_intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );      
context.startActivity( new_intent );

通知アクティビティの onCreate メソッド内で、次のように画面を起動します。

PowerManager powerManager= (PowerManager)getSystemService( Context.POWER_SERVICE );
if (!powerManager.isScreenOn()) {
    mWakeLock= powerManager.newWakeLock(
                   PowerManager.FULL_WAKE_LOCK |
                   PowerManager.ACQUIRE_CAUSES_WAKEUP, 
                   "My Tag" )
    mWakeLock.acquire();
}

画面は起動しますが、画面のロックを解除するまでアクティビティの通知は表示されません。

以下のコードでロック画面を回避できることはわかっていますが、それは望ましくありません。ユーザーが通知を読んだり応答したりすることに興味がある場合にのみ、ユーザーに電話のロックを解除してもらいたいです。

getWindow().addFlags(
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
);
4

3 に答える 3

2

私の知る限り、これは不可能です。iOS エクスペリエンスを再現しようとしているようです。Android には独自の規則があり、それらに違反することは簡単にできることではないことを認識する必要があります。

Android は少し矛盾しています。非常にオープンで、開発者として何にでもアクセスできます。その力を善悪のために使うのはあなた次第です。私が言う悪は、マルウェアのことではありません。アプリをもっと使ってほしいという通知を表示するなど、意図されていない方法で物事を使用したり、かわいらしくしようとするアプリを意味します。矛盾は、実際にはすべてにアクセスできるわけではないということです。開発者が非常に重要であると判断した部分がいくつかあり、アプリがそれらをいじることができませんでした. ロック画面はその一部です。ホームアプリを好きなだけ置き換えることができますが、交換用のロック画面が失敗して電話にアクセスできなくなることを心配する必要はありません.

これが可能であったとしても、対処すべき問題はさらに多くなります。すべてのロック画面は異なります。メーカーはそれをカスタマイズできますし、実際にカスタマイズしているため、アクティビティが電話のロック解除を妨げないという保証はありません.

于 2012-02-23T01:17:52.153 に答える
0

フラグを使用するのが正しい方法ですが、パワー マネージャーを使用するのは間違っています。

あなたの要求は私には矛盾しているように聞こえます: あなたはアクティビティをロック画面の上に表示したいと言っています (実際にはそうしません。アクティビティが見えるようにロック画面を非表示にしています)。ユーザーが最初にデバイスのロックを解除する必要があるようにします。

デバイスのロックを解除してアクティビティを確認する前に、ユーザーに通知を表示したいと考えている場合...本当にそれは望ましくないと思います。通知は非常に小さく (上部のステータス バーにあります)、投稿中に次に表示されるのは非常に一時的なものです。これは、電話のビープ音やブーンという音を聞いて、何が起こっているのかを確認しようとしている人にとっては、良い経験にはなりません。

アプリにとって意味のあるウィンドウ フラグの組み合わせを使用する必要があります。それらのさまざまな組み合わせの間で、ほとんどすべての合理的な動作を得ることができます。これらは、目覚まし時計、着信 UI などに使用されます。

于 2011-02-16T04:28:57.063 に答える
0

あなたの活動でこれを試してください

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

    boolean screenOn = pm.isScreenOn();//check id screen is on

    if(!screenOn){//if not turn it on or wkaeup the screen

        final PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "Screen On");
        wl.acquire();
        Toast.makeText(getBaseContext(), "This is WAKEUP SCREEN", Toast.LENGTH_SHORT).show();
        Thread timer = new Thread(){
            public void run(){
                try {
                    sleep(5000);
                } catch (InterruptedException e) {
                    // TODO: handle exception
                }finally{
                    wl.release();// release wakelock important
                }
            }
        };
        timer.start();
    }

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);//keep the activity running under lock screen..

お役に立てれば

于 2012-12-03T13:11:30.623 に答える