2012-07-20 9 views
5

ブロードキャストレシーバーとサービスを使用して、ユーザーが画面をオンまたはオフにしたときにリッスンし、そこから自分のアクティビティを開始するカスタムロック画面アプリを構築しました。アクティビティはロック画面を完全に置き換えるものとします。これを行うために、私のアプリは新しいロック画面として機能できるように、私のアプリはアンドロイドストックロックを無効にすることになっています。カスタムロック画面アプリのアンドロイドロックに関する問題点

代わりに、アプリケーションが最初にインストールされると、サービスが最初に起動してアプリケーションが動作しているように見えます。ユーザーが最初に携帯電話の画面をオフにしたときに、そのアプリを元の状態に戻して表示し、自分のアプリを使って携帯電話のロックを解除することができます。しかし、アンドロイドOSの中にいったん入ったら、ユーザが次回に画面をオフにして、アプリケーションに戻す代わりにそれをオンにすると、アプリケーションはアンロックされた画面に表示されます。それが一番上にあるべきとき。ここで

は私のコードです:

マイサービス:

public class MyService extends Service { 
    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onCreate() { 

     super.onCreate(); 
     Log.d("MyService","Service STARTED"); 
     final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     final BroadcastReceiver mReceiver = new ScreenReceiver(); 
     registerReceiver(mReceiver, filter); 
    } 
} 

マイ放送受信機:

public class ScreenReceiver extends BroadcastReceiver { 

public static ArrayList<String> runningApplications = new ArrayList<String>(); 
private Context ctext; 
public static boolean screenIsLocked; 
public static KeyguardManager keyguardManager; 
public static KeyguardLock lock; 

@Override 
public void onReceive(final Context context, final Intent intent) { 
    ctext = context; 
    keyguardManager = (KeyguardManager)ctext.getSystemService(Activity.KEYGUARD_SERVICE); 
    lock = keyguardManager.newKeyguardLock(Context.KEYGUARD_SERVICE); 
    lock.disableKeyguard(); 


    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
     screenIsLocked = true; 
     Log.d("ScreenReceiver", "False"); 

     Intent intenti = new Intent(); 
     intenti.setClass(context, starterActivity.class); 
     intenti.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     intenti.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(intenti); 


    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
     screenIsLocked = false; 
     Log.d("ScreenReceiver", "True"); 

        Intent intenti = new Intent(); 
        intenti.setClass(context, starterActivity.class); 
        intenti.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        intenti.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        context.startActivity(intenti); 
    } 
} 

開始された私の活動は基本的にfinish();を呼び出すだけで1つのロック解除ボタンと空であります押されたとき。

+0

これは、アプリケーションが処理されている可能性があります。この問題は連続して発生しますか? – jaisonDavis

答えて

2

あなたのコードをコンパイルしようとしましたが、あなたが話していたのと同じエラーが発生しました。私はそれを動作させるように修正しようとしましたが、ついに問題が発生しました!!!私は問題

それを試してみて、どんな問題があれば教えてくださいを克服することができた放送受信機のクラスには、この変更に伴い

public class ScreenReceiver extends BroadcastReceiver { 

    public static ArrayList<String> runningApplications = new ArrayList<String>(); 
    private Context ctext; 
    public static boolean screenIsLocked; 
    public static KeyguardManager keyguardManager; 
    public static KeyguardLock lock; 

    @Override 
    public void onReceive(final Context context, final Intent intent) { 
     ctext = context; 
     keyguardManager = (KeyguardManager)ctext.getSystemService(Activity.KEYGUARD_SERVICE); 
     lock = keyguardManager.newKeyguardLock(Context.KEYGUARD_SERVICE); 
     lock.disableKeyguard(); 


     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      screenIsLocked = true; 
      Log.d("ScreenReceiver", "False"); 

      Intent intenti = new Intent(); 
      intenti.setClass(context, starterActivity.class); 
      intenti.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      intenti.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(intenti); 


     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      screenIsLocked = false; 
      Log.d("ScreenReceiver", "True"); 

         Intent intenti = new Intent(); 
         intenti.setClass(context, starterActivity.class); 
         intenti.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         intenti.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         context.startActivity(intenti); 
     } 
    } 

編集:私はそれがメモリを必要とする場合、Androidはアプリがダンプ....問題はfinish()方法にあるのかもしれないと思う...私はfinish()アプリを中傷にアンドロイドを手助けするかもしれないと思う(これは、なぜあなたの理由かもしれません問題はランダムに発生します)

+1

これは私のアプリケーション内でのみ動作しますが、アンドロイドOSでは動作しません。 – Peter

+0

申し訳ありませんが、あなたが「アンドロイドOSから」という言葉を理解していません – jaisonDavis

+0

私はただ試しましたが、すぐにロック画面に戻りませんが、次回はデバイスのロックを解除してもアプリケーションに移動しません既定のロック解除者 – Peter

4

キーガード関連ロジックの動作は、デバイスによって異なる場合があります。なぜなら、ロックスクリーンはしばしばデバイスメーカー(つまり在庫ではない)によってカスタムメイドされているからです。その中には、使用するキーガードロジックを尊重するものもあれば、そうでないものもあります。このデバイスは、まだこのことについて彼らの発言権を持っている、しかし、問題を解決することはできません

// inside activity 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
     | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 

:キーガードを制御する新しい方法私の知る限りでも

は、ウィンドウのフラグを使用することです。

など。私の経験から、Galaxy Nexusはあなたのアクティビティのウィンドウをキーガードの上に表示しますが、Googleブランドのデバイスはフラグを尊重しなければならないと思います(つまり、あなたはあなたのアクティビティの戻るボタンを押すと、標準的なロック画面--- HTC One Xが正しく却下部分を処理しているように見えます。あなたのアクティビティウィンドウにより、標準のロック画面が期待どおりに解除されます。

すべてのデバイスを強制的に正しく動作させる方法が見つかりませんでした。 Android APIは、カスタムロック画面(少なくとも現在はない)を作成できるようにするものではありません。店内のものを見てください。それらはすべて十分に安定していないという全く同じ問題を抱えています。

Dianne Hackborn says in this Google Groups answerとして、この点でできることはハックですので、時々壊れることを期待してください。

関連する問題