Androidプログラミングのカスタムスクリーンロックの実例分析


この例は、Androidプログラミングのカスタムスクリーンロックについて述べている。皆さんに参考にしてあげます。具体的には以下の通りです。
長い時間をかけて独自のスクリーンロックを研究しましたが、実際に実現するのはあまり神秘的ではないことが分かりました。でも、注意すべきところがあります。
まず流れを説明します。スクリーンのロック画面は一般的にスクリーンを閉じる時に有効にして、スクリーンを開ける時に私達の前に現れます。だから、スクリーンのロックのタイミングが分かりました。ちょうどスクリーンのスイッチは相応の放送が出るので、システムのようにスクリーンのスイッチのイベントを捉えることができます。
ラジオ対応の二つのアクション
参照

android.intent.action.SCREEN_ON
android.intent.action.SCREEN_OFF

面白いことに、私はME 860で二つの放送を見ました。
参照

android.intent.action.batteryprofile.SCR_OFF
android.intent.action.batteryprofile.SCR_ON

これはmotoが自分で定義した放送かもしれません。皆さんが必要です。
ラジオだけ受信したら、ロック画面はどうやってシステムのロックを変えますか?実は私達のところは別にシステムのロックスクリーンを交替していません。ただ私達のロックスクリーンはシステムのロックスクリーンを開けています。
ここで注意してください。上記のactionはAndroid Manifest.xmlに登録できません。トリガできません。だからここで私が採用した方法は一つのserviceにおいて動的に登録して、放送を傍受するのが正常です。
ここに加えて、serviceの防犯機能もあります。サービスのプロセスがなくなったら、スクリーンスイッチの放送はどうしても受信できません。
システムが回収したserviceなら、システムは時間が経ってから、資源が十分な状況で再起動します。でも、自分のserviceが冷たいベンチに座りたくないです。だから、システムをオフにするために、サービスを以下のようにします。
serviceライフサイクルにおいて:

Intent startIntent=null;
@Override
 public void onStart(Intent intent, int startId) {
  startIntent=intent;
  IntentFilter filter=new IntentFilter();
  filter.addAction(Intent.ACTION_SCREEN_ON);
  filter.addAction(Intent.ACTION_SCREEN_OFF);
  receiver=new RelativeBroadcastReceiver();
  registerReceiver(receiver, filter);
  System.out.println("service onStart and action is "+intent.getAction());
  System.out.println("service onStart and startId is "+startId);
 };
 @Override
 public void onDestroy() {
  // TODO Auto-generated method stub
  System.out.println("service onDestroy");
  unregisterReceiver(receiver);
  if(startIntent!=null){
   System.out.println("serviceIntent not null");
   startService(startIntent);
  }

私達はserviceを開くintentを保留しています。オンデストロイサイクルに入るともう一回自分を起動します。システムはあなたのこのパワーを見て、常駐メモリを承諾するしかないです。
しかし、いくつかのメモリ管理ソフトがプログラムのプロセスを殺した場合、上記の方法は役に立たなくなります。私達はやはりいくつかのキーラジオを傍受することによって自分のサービスを開始することができます。91アシスタントのようなものです。Wifi接続をモニターしたり、バッテリーの電気量が変化したりと、自分のサービスを開始します。
自分のserviceが常駐することを保証して、この時私達自身の放送の受信機が作用を発揮するべきです。

@Override
 public void onReceive(Context context, Intent intent) {
  // TODO Auto-generated method stub
  String action=intent.getAction();
  System.out.println("action is "+action);
  Intent lockIntent=new Intent(context,MyLockScreen.class);
  lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  context.startActivity(lockIntent);
}

lockIntent.addFlags(Intent.FLAG_)を追加する必要があります。ACT IVITY_NEW_TASK;追加されていない場合はエラーが発生しますが、これに加えて後で問題があります。これは何度も退出することになります。
実際には、これらのactivityを管理するためにstackをカスタマイズすることができます。他の方法があります。
activityを起動してから、私達は元のスクリーンロックのインターフェイスを発見しました。これも前に述べたものです。私達のスクリーンロックはシステムのスクリーンロックを開く必要があります。
システムのロック画面を開く:

super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
setContentView(R.layout.main);

この二つのフラッグを追加したら、システムのロック画面が私たち自身のロック画面に置き換えられます。
スクリーンをロックして機能を交替しても完成しました。実は、システムのロックも修正できますが、フレーム層に設計されているので、普及も面倒です。
ここで述べたように、皆さんのAndroidプログラムの設計に役に立ちます。