Androidはタイミングタスクとアラームを実現します。
Androidではタイミングは様々な種類がありますが、一般的なHandlerとThreadの結合、handle.postDelayed、および使用するAlarmMangerなどはタイミングタスクの実行が可能ですが、使用シーンは大きく異なります。ここでは主にAlarmManagerでタイミングタスクを実現する方法があります。
知識点に関すること:
1)BroadCastReceiverタスク受信
2)Count DownTimerカウントダウン
3)AlertDialogタスクの注意
4)AlarmManagerタイミングタスク
ここで実現された需要は毎日24時にシャットダウンし、ある設備はカスタマイズシステムであり、長時間のシャットダウンによるアプリケーションのタイムアウトを防止し、シャットダウン時にユーザーにヒントを与え、操作がない場合は自動的にシャットダウンします。
最初のステップは簡単なレイアウトを実現し、レイアウトにButtonを2つ書き、設定を一つキャンセルします。
第二ステップ:初期化ページレイアウトとButton
すべてのコードをそのままにして、タイミングタスクを実現します。
ボックスには次のような権限が必要です。
知識点に関すること:
1)BroadCastReceiverタスク受信
2)Count DownTimerカウントダウン
3)AlertDialogタスクの注意
4)AlarmManagerタイミングタスク
ここで実現された需要は毎日24時にシャットダウンし、ある設備はカスタマイズシステムであり、長時間のシャットダウンによるアプリケーションのタイムアウトを防止し、シャットダウン時にユーザーにヒントを与え、操作がない場合は自動的にシャットダウンします。
最初のステップは簡単なレイアウトを実現し、レイアウトにButtonを2つ書き、設定を一つキャンセルします。
第二ステップ:初期化ページレイアウトとButton
public class MainActivity extends AppCompatActivity
implements View.OnClickListener{
Button btn_set,btn_cancel;
AlarmManager am;
PendingIntent pi;
long time;
@Override
protected void onCreate(@NullableBundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
btn_set=findViewById(R.id.btn_Set);
btn_cancel=findViewById(R.id.btn_Cancel);
btn_set.setOnClickListener(this);
btn_cancel.setOnClickListener(this);
initAlarm();
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btn_Set:
setAlarm();
break;
case R.id.btn_Cancel:
cancelAlarm();
break;
}
}
// Alarm
private void initAlarm(){
pi=PendingIntent.getBroadcast(this,0,getMsgIntent(),0);
time=System.currentTimeMillis();
am= (AlarmManager) getSystemService(ALARM_SERVICE);
}
private Intent getMsgIntent(){
//AlarmReceiver
Intent intent=newIntent(this,AlarmReceiver.class);
intent.setAction(AlarmReceiver.BC_ACTION);
intent.putExtra("msg"," ");
return intent;
}
//
private void setAlarm(){
//android Api
if(Build.VERSION.SDK_INT<19){
am.set(AlarmManager.RTC_WAKEUP,getTimeDiff(),pi);
}else{
am.setExact(AlarmManager.RTC_WAKEUP,getTimeDiff(),pi);
}
}
public long getTimeDiff(){
// 15:55 , ,
Calendar ca=Calendar.getInstance();
ca.set(Calendar.HOUR_OF_DAY,15);
ca.set(Calendar.MINUTE,55);
ca.set(Calendar.SECOND,0);
return ca.getTimeInMillis();
}
//
private void cancelAlarm(){
am.cancel(pi);
}
}
放送の主要コード
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Build;
import android.os.CountDownTimer;
import android.util.Log;
import android.view.WindowManager;
import android.widget.Toast;
public class AlarmReceiver extends BroadcastReceiver {
private String TAG=this.getClass().getSimpleName();
public static final String BC_ACTION="com.ex.action.BC_ACTION";
private AlertDialog.Builder builder;
CountDownTimer timer;
@Override
public void onReceive(Context context,Intent intent) {
String msg=intent.getStringExtra("msg");
Log.i(TAG,"get Receiver msg :"+msg);
Toast.makeText(context,msg,Toast.LENGTH_LONG).show();
showConfirmDialog(context);
}
private void showConfirmDialog(Context context){
builder=newAlertDialog.Builder(context);
builder.setTitle(" ")
.setMessage(" 30 ")
.setCancelable(false)
.setPositiveButton(" ",
newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, intwhich) {
if(timer!=null)timer.cancel();
}
});
setShowDialogType(context,builder.create());
}
private void setShowDialogType(Context context,AlertDialog alertDialog){
int type;
if(Build.VERSION.SDK_INT>24){
type= WindowManager.LayoutParams.TYPE_PHONE;
}else if(Build.VERSION.SDK_INT>18){
type= WindowManager.LayoutParams.TYPE_TOAST;
}else{
type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}
alertDialog.getWindow().setType(type);
alertDialog.show();
// , ( )
startCountDownTimer(context,alertDialog,30);
}
private void startCountDownTimer(final Context context,final AlertDialog alertDialog,inttime){
timer=newCountDownTimer(time*1000,1000) {
@Override
public void onTick(long millisUntilFinished) {
//
Log.i(TAG,"onTick time :"+millisUntilFinished);
alertDialog.setMessage(" "+(millisUntilFinished/1000)+" ");
}
@Override
public void onFinish() {
//
Log.i(TAG," !");
alertDialog.dismiss();
//
// shutdown(context);
}
};
timer.start();
}
//shoutDown
public void shutDown(Context context) {
String action ="android.intent.action.ACTION_REQUEST_SHUTDOWN";
String extraName ="android.intent.extra.USER_REQUESTED_SHUTDOWN";
Intent intent =newIntent(action);
intent.putExtra(extraName, true);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
Android Manifest.xmlでは、設定ファイルで宣言しています。すべてのコードをそのままにして、タイミングタスクを実現します。
ボックスには次のような権限が必要です。
< uses-permission android:name=”android.permission.SYSTEM_ALERT_WINDOW”/>
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。