Androidサスペンションボックスは、サービスでサスペンション窓を開きます.サービスでDialogを開きます.
12787 ワード
この記事では、Serviceにサスペンションボックスを表示し、ServiceでDialogをポップアップし、Serviceで時間のかかるポーリング操作を行う方法について説明します.
バックグラウンド要件:
会社のプロジェクトの現在の論理はこのようにしています:1つの命令を送信して、それから3秒に1回ポーリングしてこの命令が成功したかどうかを照会して、この間インタフェースは操作できません;
そして、インタフェースを隠すことでユーザーの操作体験が悪くならないため、変更する必要があります.現在のニーズは、このポーリングクエリーコマンドがバックエンドで正常に行われたかどうか、インタフェースにはユーザーがコマンドをクエリーしていることを示す懸濁ボックスがあります.
はい、バックエンドでコマンドをクエリーしてユーザーを無感にすることができて、サービスで実現することができて、それから懸濁枠はWindowMessageで実現して、ポーリングクエリーコマンドはHandlerあるいはIntentサービスで実現します;大体そうですが、まずDemoをください.
1、サービスを開く:必要な情報はActivityがIntentを使ってサービスに伝達する;
サービスのonCreateは作成時に一度だけ実行され、onStartCommand()はこのサービスを開くたびに実行されます.この登録を忘れないでください.
2、サービスが正常にオープンした後に懸濁枠を作成する
サスペンションボックスには権限が必要であり、この権限は危険レベルの権限に属し、API 23以上はユーザーが手動で開く必要がある.
適合8.0:
3、Handlerを使用してクエリー命令をポーリングする;
コマンドを検索すると、ポップアップ・プロンプトが表示され、Dialogがポップアップされます.ServiceでDialogをポップアップするには、下のコードを設定する必要があります.また、ポップアップ権限も必要です.
4、サービス破棄時、Handler情報をクリアして懸濁枠を閉じる.
すべてのサービスコード:
サスペンションボックスは2種類使いましたが、もう1つはFloatWindowで、興味があればGitHubに行って調べてみてください.
バックグラウンド要件:
会社のプロジェクトの現在の論理はこのようにしています:1つの命令を送信して、それから3秒に1回ポーリングしてこの命令が成功したかどうかを照会して、この間インタフェースは操作できません;
そして、インタフェースを隠すことでユーザーの操作体験が悪くならないため、変更する必要があります.現在のニーズは、このポーリングクエリーコマンドがバックエンドで正常に行われたかどうか、インタフェースにはユーザーがコマンドをクエリーしていることを示す懸濁ボックスがあります.
はい、バックエンドでコマンドをクエリーしてユーザーを無感にすることができて、サービスで実現することができて、それから懸濁枠はWindowMessageで実現して、ポーリングクエリーコマンドはHandlerあるいはIntentサービスで実現します;大体そうですが、まずDemoをください.
1、サービスを開く:必要な情報はActivityがIntentを使ってサービスに伝達する;
Intent intent = new Intent(this,MyService.class);
intent.putExtra("args"," ");
startService(intent);
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
args = intent.getStringExtra("args");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
サービスのonCreateは作成時に一度だけ実行され、onStartCommand()はこのサービスを開くたびに実行されます.この登録を忘れないでください.
2、サービスが正常にオープンした後に懸濁枠を作成する
サスペンションボックスには権限が必要であり、この権限は危険レベルの権限に属し、API 23以上はユーザーが手動で開く必要がある.
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
args = intent.getStringExtra("args");
initView();
return super.onStartCommand(intent, flags, startId);
}
/**
* WindowManager , 6.0 ;
*/
private void initView() {
if (Build.VERSION.SDK_INT >= 23) {
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));// , ;
startActivity(intent);
} else {
openWindow();
}
}else {
openWindow();
}
}
private void openWindow(){
windowManager = (WindowManager) this.getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
// layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
// layoutParams.token = this.getWindow().getDecorView().getWindowToken(); // , activity ;
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
layoutParams.format = PixelFormat.TRANSLUCENT; //
layoutParams.gravity = Gravity.TOP | Gravity.RIGHT; //
view = LayoutInflater.from(this).inflate(R.layout.view_win,null);
windowManager.addView(view,layoutParams);
}
適合8.0:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
}
3、Handlerを使用してクエリー命令をポーリングする;
コマンドを検索すると、ポップアップ・プロンプトが表示され、Dialogがポップアップされます.ServiceでDialogをポップアップするには、下のコードを設定する必要があります.また、ポップアップ権限も必要です.
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
private Handler mHandler = new Handler(){
@Override
public void dispatchMessage(Message msg) {
super.dispatchMessage(msg);
switch (msg.what){
case HANDLERSIGN:
Log.i(TAG, "dispatchMessage: "+args+(++num));
mHandler.sendEmptyMessageDelayed(HANDLERSIGN,HANDLERTIME);
if (num == 5){
AlertDialog.Builder builder = new AlertDialog.Builder(MyService.this);
builder.setPositiveButton(" ", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
MyService.this.stopSelf();
}
});
AlertDialog dialog = builder.create();
dialog.setMessage(" "+num);
dialog.setTitle(" ");
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();
}
break;
}
}
};
private final String TAG = "ccb";
private String args;
private int num;
private final int HANDLERSIGN = 10;
private final int HANDLERTIME = 2010;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
args = intent.getStringExtra("args");
initView();
initData();
return super.onStartCommand(intent, flags, startId);
}
private void initData() {
mHandler.sendEmptyMessageDelayed(HANDLERSIGN,HANDLERTIME);
}
4、サービス破棄時、Handler情報をクリアして懸濁枠を閉じる.
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy: ,ByKill");
mHandler.removeCallbacksAndMessages(null);
if (windowManager != null) windowManager.removeView(view);
}
すべてのサービスコード:
サスペンションボックスは2種類使いましたが、もう1つはFloatWindowで、興味があればGitHubに行って調べてみてください.
package com.example.administrator.xuanfudemo;
import android.Manifest;
import android.app.AlertDialog;
import android.app.Service;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import com.yhao.floatwindow.FloatWindow;
import com.yhao.floatwindow.PermissionListener;
import com.yhao.floatwindow.Screen;
import com.yhao.floatwindow.ViewStateListener;
public class MyService extends Service {
private WindowManager windowManager;
private View view;
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
super.onCreate();
}
private Handler mHandler = new Handler(){
@Override
public void dispatchMessage(Message msg) {
super.dispatchMessage(msg);
switch (msg.what){
case HANDLERSIGN:
Log.i(TAG, "dispatchMessage: "+args+(++num));
mHandler.sendEmptyMessageDelayed(HANDLERSIGN,HANDLERTIME);
if (num == 5){
AlertDialog.Builder builder = new AlertDialog.Builder(MyService.this);
builder.setPositiveButton(" ", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
MyService.this.stopSelf();
// if (windowManager != null) windowManager.removeView(view);
}
});
AlertDialog dialog = builder.create();
dialog.setMessage(" "+num);
dialog.setTitle(" ");
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();
}
break;
}
}
};
private final String TAG = "ccb";
private String args;
private int num;
private final int HANDLERSIGN = 10;
private final int HANDLERTIME = 2010;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
args = intent.getStringExtra("args");
// initView();
initView2();
initData();
return super.onStartCommand(intent, flags, startId);
}
/**
* FloatWindow FloatWindow ;
*/
private void initView2() {
FloatWindow
.with(getApplicationContext())
.setView(LayoutInflater.from(this).inflate(R.layout.view_win,null))
.setWidth(100) //
.setHeight(Screen.height,0.2f)
.setX(100) //
.setY(Screen.height,0.3f)
.setDesktopShow(true) //
.setViewStateListener(new ViewStateListener() {
@Override
public void onPositionUpdate(int i, int i1) {
}
@Override
public void onShow() {
}
@Override
public void onHide() {
}
@Override
public void onDismiss() {
}
@Override
public void onMoveAnimStart() {
}
@Override
public void onMoveAnimEnd() {
}
@Override
public void onBackToDesktop() {
}
})
.setPermissionListener(new PermissionListener() {
@Override
public void onSuccess() {
}
@Override
public void onFail() {
}
})
.build();
FloatWindow.get().show();
}
/**
* WindowManager , 6.0 ;
*/
private void initView() {
if (Build.VERSION.SDK_INT >= 23) {
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse( "package:"+"com.example.administrator.xuanfudemo"));
startActivity(intent);
} else {
openWindow();
}
}else {
openWindow();
}
}
private void openWindow(){
windowManager = (WindowManager) this.getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
// layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
// layoutParams.token = this.getWindow().getDecorView().getWindowToken();
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
layoutParams.format = PixelFormat.TRANSLUCENT;
layoutParams.gravity = Gravity.TOP | Gravity.RIGHT;
view = LayoutInflater.from(this).inflate(R.layout.view_win,null);
windowManager.addView(view,layoutParams);
}
private void initData() {
mHandler.sendEmptyMessageDelayed(HANDLERSIGN,HANDLERTIME);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy: ,ByKill");
mHandler.removeCallbacksAndMessages(null);
if (windowManager != null) windowManager.removeView(view);
FloatWindow.destroy();
}
}