update:2019.04.22

fix:增加绑定确认
add:
This commit is contained in:
2020-04-22 18:23:50 +08:00
parent ecf5aa3d1c
commit f037e1cb12
17 changed files with 766 additions and 31 deletions

View File

@@ -15,8 +15,8 @@ android {
applicationId "com.info.sn"
minSdkVersion 23
targetSdkVersion 28
versionCode 17
versionName "1.1.7"
versionCode 18
versionName "1.1.8"
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
@@ -132,9 +132,9 @@ dependencies {
implementation 'com.alibaba:fastjson:1.2.21'
// implementation 'com.blankj:utilcode:1.26.0'
implementation 'com.arialyy.aria:core:3.7.10'
annotationProcessor 'com.arialyy.aria:compiler:3.7.10'
implementation 'com.blankj:utilcode:1.26.0'
implementation 'com.arialyy.aria:core:3.8.5'
annotationProcessor 'com.arialyy.aria:compiler:3.8.5'
implementation "org.java-websocket:Java-WebSocket:1.4.1"

View File

@@ -40,7 +40,7 @@
android:supportsRtl="true"
android:theme="@style/AppTheme">
<receiver
android:name=".service.APKinstallReceiver"
android:name=".receiver.APKinstallReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
@@ -167,7 +167,7 @@
<service android:name=".service.StepService" />
<receiver
android:name=".service.BootReceiver"
android:name=".receiver.BootReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">

View File

@@ -62,6 +62,7 @@ import static com.info.sn.jpush.TagAliasOperatorHelper.TagAliasBean;
import static com.info.sn.jpush.TagAliasOperatorHelper.sequence;
public class MainActivity extends AppCompatActivity {
public static final String REFRESHACTION = BuildConfig.APPLICATION_ID + ".REFRESH";
public static boolean isForeground = false;
private ImageView imageView, exit;
private TextView tv_note, tv_devsn, tv_username, tv_school, tv_grade, tv_version;
@@ -70,6 +71,8 @@ public class MainActivity extends AppCompatActivity {
private int DeviceInfo;
private long mExitTime;
private RefreshReceiver mRefreshReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -82,6 +85,7 @@ public class MainActivity extends AppCompatActivity {
pm.setApplicationEnabledSetting("com.info.sn", PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0);
requestPermission();
registerMessageReceiver(); // used for receive msg
registerRefreshReceiver();
String rid = JPushInterface.getRegistrationID(getApplicationContext());
if (!rid.isEmpty()) {
ToastUtil.debugShow("RegId:" + rid);
@@ -98,6 +102,23 @@ public class MainActivity extends AppCompatActivity {
startService(new Intent(MainActivity.this, MyDownloadService.class));
}
public void registerRefreshReceiver() {
mRefreshReceiver = new RefreshReceiver();
IntentFilter filter = new IntentFilter();
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
filter.addAction(REFRESHACTION);
registerReceiver(mRefreshReceiver, filter);
}
public class RefreshReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (REFRESHACTION.equals(intent.getAction())) {
HTTPInterface.checkDevicesInfo(handler);
}
}
}
private void initView() {
tv_note = findViewById(R.id.tv_note);
imageView = findViewById(R.id.imageView);
@@ -491,7 +512,7 @@ public class MainActivity extends AppCompatActivity {
//for receive customer msg from jpush server
private MessageReceiver mMessageReceiver;
public static final String MESSAGE_RECEIVED_ACTION = "com.example.jpushdemo.MESSAGE_RECEIVED_ACTION";
public static final String MESSAGE_RECEIVED_ACTION = "com.info.sn.MESSAGE_RECEIVED_ACTION";
public static final String KEY_TITLE = "title";
public static final String KEY_MESSAGE = "message";
public static final String KEY_EXTRAS = "extras";
@@ -524,4 +545,9 @@ public class MainActivity extends AppCompatActivity {
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mRefreshReceiver);
}
}

View File

@@ -1,31 +1,49 @@
package com.info.sn;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.Application;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;
import com.arialyy.annotations.Download;
import com.arialyy.aria.core.Aria;
import com.arialyy.aria.core.download.DownloadEntity;
import com.arialyy.aria.core.task.DownloadTask;
import com.blankj.utilcode.util.ToastUtils;
import com.info.sn.jpush.LocalBroadcastManager;
import com.info.sn.network.UrlPath;
import com.info.sn.network.api.HTTPInterface;
import com.info.sn.service.MyDownloadService;
import com.info.sn.utils.ApkUtils;
import com.info.sn.utils.LogUtils;
import com.info.sn.utils.SPUtils;
import com.info.sn.utils.ToastUtil;
import com.info.sn.utils.Utils;
import com.info.sn.view.CustomDialog;
import com.info.sn.view.InfoDialog;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.model.Response;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.net.URI;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;
@@ -49,7 +67,6 @@ public class MyApplication extends Application {
OkGo.getInstance().init(this);
// NetworkUtils.registerNetworkStatusChangedListener(this);
Aria.init(this);
Aria.download(this).register();
Aria.download(this).resumeAllTask();
}
@@ -80,7 +97,7 @@ public class MyApplication extends Application {
public static String getTaskPackname() {
String currentApp = "CurrentNULL";
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
UsageStatsManager usm = (UsageStatsManager) context.getSystemService("usagestats");
@SuppressLint("WrongConstant") UsageStatsManager usm = (UsageStatsManager) context.getSystemService("usagestats");
long time = System.currentTimeMillis();
List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time);
if (appList != null && appList.size() > 0) {
@@ -139,6 +156,7 @@ public class MyApplication extends Application {
private static final String JIGUANG_APP_LOCKEDSTATE = "8";
private static final String JIGUANG_FORCE_INSTALLAPK = "9";
private static final String JIGUANG_FORCE_UNINSTALLAPK = "10";
private static final String JIGUANG_BIND_DEVIVES = "11";
synchronized public void manageCustomMessage(CustomMessage customMessage) {
@@ -184,6 +202,8 @@ public class MyApplication extends Application {
case JIGUANG_FORCE_UNINSTALLAPK:
unintallApk(EXTRA);
break;
case JIGUANG_BIND_DEVIVES:
bindService(EXTRA);
}
@@ -320,11 +340,11 @@ public class MyApplication extends Application {
String package0 = extra.getString("package0");
String package1 = extra.getString("package1");
if (package0.length() != 0) {
boolean qch_jgy_network_disallow = Settings.System.putString(getContentResolver(), "qch_jgy_network_allow", package0);
LogUtils.e("fht", "setAppNetworkstate::" + qch_jgy_network_disallow + ":" + Settings.System.getString(getContentResolver(), "qch_jgy_network_allow"));
boolean qch_jgy_network_allow = Settings.System.putString(getContentResolver(), "qch_jgy_network_allow", package0);
LogUtils.e("fht", "setAppNetworkstate::" + qch_jgy_network_allow + ":" + Settings.System.getString(getContentResolver(), "qch_jgy_network_allow"));
} else {
boolean qch_jgy_network_disallow = Settings.System.putString(getContentResolver(), "qch_jgy_network_allow", "invalid");
LogUtils.e("fht", "setAppNetworkstate::" + qch_jgy_network_disallow + ":" + Settings.System.getString(getContentResolver(), "qch_jgy_network_allow"));
boolean qch_jgy_network_allow = Settings.System.putString(getContentResolver(), "qch_jgy_network_allow", "invalid");
LogUtils.e("fht", "setAppNetworkstate::" + qch_jgy_network_allow + ":" + Settings.System.getString(getContentResolver(), "qch_jgy_network_allow"));
}
if (package1.length() != 0) {
boolean qch_jgy_network_disallow = Settings.System.putString(getContentResolver(), "qch_jgy_network_disallow", package1);
@@ -369,11 +389,21 @@ public class MyApplication extends Application {
//静默安装应用使用okgo断网会出现问题等待修改使用aria
synchronized private void intallApk(String jsondata) {
try {
JSONObject extra = new JSONObject(jsondata);
final String packages = extra.getString("package");
ToastUtil.debugShow("收到应用安装消息:包名" + packages);
String url = extra.getString("url");
if (Aria.download(this).taskExists(url)) {
List<DownloadEntity> entity = Aria.download(this).getDownloadEntity(url);
for (DownloadEntity downloadEntity : entity) {
Aria.download(this).load(downloadEntity.getId()).cancel(true);
}
}
File file = new File(Environment.getExternalStoragePublicDirectory("Download") + "/Sninfo/apk");
file.mkdirs();
Aria.download(this)
@@ -402,7 +432,7 @@ public class MyApplication extends Application {
// LogUtils.e("downloadProgress", "已下载:" + progress.currentSize + ",总大小:" + progress.totalSize + ",进度:" + progress.fraction + ",当前网速:" + progress.speed);
// }
// });
Aria.download(this).resumeAllTask();
} catch (JSONException e) {
e.printStackTrace();
LogUtils.e("intallApk", e.getMessage());
@@ -430,6 +460,97 @@ public class MyApplication extends Application {
}
}
synchronized void bindService(String json) {
ToastUtil.debugShow("收到绑定设备请求");
try {
JSONObject object = new JSONObject(json);
String userName = object.getString("member_name");
final String id = object.getString("id");
String phoneNum = object.getString("member_phone");
final CustomDialog dialog = new CustomDialog(getAppContext());
dialog.setMessage(phoneNum + "的用户请求绑定你的平板")
.setTitle("绑定请求")
.setPositive("允许")
.setNegtive("拒绝")
// .setSingle(true)
.setOnClickBottomListener(new CustomDialog.OnClickBottomListener() {
@Override
public void onPositiveClick() {
bind(id);
dialog.dismiss();
}
@Override
public void onNegtiveClick() {
ToastUtil.show("设备取消绑定");
dialog.dismiss();
}
}).show();
// AlertDialog.Builder builder = new AlertDialog.Builder(this)
// .setTitle("设备绑定")
// .setIcon(R.mipmap.ic_launcher)
// .setCancelable(false)
// .setMessage("用户:“" + userName + "”" + "\n手机“" + phoneNum + "”" + "\n请求绑定此设备")
// .setPositiveButton("确认绑定", new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialogInterface, int i) {
// bind(id);
// }
// })
// .setNegativeButton("取消", new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// dialog.dismiss();
// ToastUtil.show("设备取消绑定");
// }
// });
// AlertDialog ad = builder.create();
// ad.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
// ad.setCanceledOnTouchOutside(false); //点击外面区域不会让dialog消失
// ad.show();
} catch (JSONException e) {
e.printStackTrace();
LogUtils.e("bindService", e.getMessage());
}
}
synchronized private void bind(String id) {
OkGo.<String>post(UrlPath.BIND_DEVICES)
.params("id", id)
.params("sn", Utils.getSerial())
.execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
String s = response.body();
try {
JSONObject jsonObject = new JSONObject(s);
int code = jsonObject.getInt("code");
String msg = jsonObject.getString("msg");
if (code == 200) {
ToastUtil.show("绑定成功");
} else {
ToastUtil.show(msg);
}
} catch (JSONException e) {
e.printStackTrace();
}
Intent intent = new Intent(MainActivity.REFRESHACTION);
sendBroadcast(intent);
}
@Override
public void onError(Response<String> response) {
super.onError(response);
Log.e("bind", response.getException().getMessage());
}
});
}
// @Override
// public void onDisconnected() {
// LogUtils.e("onDisconnected", "网络断开");
@@ -443,15 +564,4 @@ public class MyApplication extends Application {
// }
//在这里处理任务执行中的状态,如进度进度条的刷新
@Download.onTaskRunning
protected void running(DownloadTask task) {
Log.e("aria running", task.getState() + "--" + task.getPercent() + "--" + task.getExtendField());
}
@Download.onTaskComplete
void taskComplete(DownloadTask task) {
//在这里处理任务完成的状态
ApkUtils.installApkInSilence(task.getFilePath(), task.getExtendField());
}
}

View File

@@ -1,4 +1,4 @@
package com.info.sn.service;
package com.info.sn.network;
import android.util.Log;

View File

@@ -19,6 +19,9 @@ public class UrlPath {
//获取当前最顶层应用和电量
public final static String SEND_DRIVE_STATE = HOMEPATHRUL + "Online/online";
public final static String GET_ALL_PACKAGENAME = HOMEPATHRUL + "/App/allPackage";
public final static String GET_ALL_PACKAGENAME = HOMEPATHRUL + "App/allPackage";
//获取所有应用包名
public final static String BIND_DEVICES = HOMEPATHRUL + "Member/binding";
//绑定设备消息
}

View File

@@ -1,4 +1,4 @@
package com.info.sn.service;
package com.info.sn.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;

View File

@@ -1,10 +1,14 @@
package com.info.sn.service;
package com.info.sn.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.info.sn.service.GuardService;
import com.info.sn.service.MyDownloadService;
import com.info.sn.service.StepService;
public class BootReceiver extends BroadcastReceiver {

View File

@@ -18,6 +18,11 @@ import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.arialyy.annotations.Download;
import com.arialyy.aria.core.Aria;
import com.arialyy.aria.core.task.DownloadTask;
import com.blankj.utilcode.util.NetworkUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.info.sn.BuildConfig;
import com.info.sn.R;
import com.info.sn.network.api.HTTPInterface;
@@ -28,9 +33,10 @@ import com.lzy.okgo.model.Progress;
import com.lzy.okgo.model.Response;
import java.io.File;
import java.lang.ref.WeakReference;
// 下载管理服务
public class MyDownloadService extends Service {
public class MyDownloadService extends Service implements NetworkUtils.OnNetworkStatusChangedListener {
@Override
@@ -46,6 +52,10 @@ public class MyDownloadService extends Service {
CheckUpdateByPackageName("com.uiuios.updatetools", handler);
//静默升级更新工具
HTTPInterface.getAllAppPackageName(handler);
Aria.download(this).register();
Aria.download(this).resumeAllTask();
//恢复所有未完成的下载任务
return super.onStartCommand(intent, flags, startId);
}
@@ -265,4 +275,31 @@ public class MyDownloadService extends Service {
}
}
@Override
public void onDisconnected() {
}
@Override
public void onConnected(NetworkUtils.NetworkType networkType) {
Aria.download(this).resumeAllTask();
}
//在这里处理任务执行中的状态,如进度进度条的刷新
@Download.onTaskRunning
protected void running(DownloadTask task) {
ToastUtils.showShort("正在下载:" + task.getExtendField() + "-" + task.getPercent() + "%");
Log.e("aria running", "正在下载:" + task.getState() + "--" + task.getPercent() + "--" + task.getExtendField());
}
@Download.onTaskComplete
void taskComplete(DownloadTask task) {
//在这里处理任务完成的状态
ApkUtils.installApp(MyDownloadService.this, task.getFilePath());
Log.e("taskComplete", task.getExtendField());
Aria.download(this).load(task.getDownloadEntity().getId()).cancel();
}
}

View File

@@ -20,6 +20,7 @@ import android.util.Log;
import androidx.annotation.Nullable;
import com.info.sn.KeepAliveConnection;
import com.info.sn.network.JWebSocketClient;
import com.info.sn.utils.LogUtils;
import com.info.sn.utils.ServiceAliveUtils;
import com.info.sn.utils.Utils;

View File

@@ -0,0 +1,241 @@
package com.info.sn.view;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.info.sn.R;
/**
* description:自定义dialog
*/
public class CustomDialog extends Dialog {
/**
* 显示的图片
*/
private ImageView imageIv;
/**
* 显示的标题
*/
private TextView titleTv;
/**
* 显示的消息
*/
private TextView messageTv;
/**
* 确认和取消按钮
*/
private Button negtiveBn, positiveBn;
/**
* 按钮之间的分割线
*/
private View columnLineView;
public CustomDialog(Context context) {
super(context, R.style.CustomDialog);
}
/**
* 都是内容数据
*/
private String message;
private String title;
private String positive, negtive;
private int imageResId = -1;
/**
* 底部是否只有一个按钮
*/
private boolean isSingle = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_dialog);
//按空白处不能取消动画
setCanceledOnTouchOutside(false);
getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
//初始化界面控件
initView();
//初始化界面数据
refreshView();
//初始化界面控件的事件
initEvent();
}
/**
* 初始化界面的确定和取消监听器
*/
private void initEvent() {
//设置确定按钮被点击后,向外界提供监听
positiveBn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onClickBottomListener != null) {
onClickBottomListener.onPositiveClick();
}
}
});
//设置取消按钮被点击后,向外界提供监听
negtiveBn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onClickBottomListener != null) {
onClickBottomListener.onNegtiveClick();
}
}
});
}
/**
* 初始化界面控件的显示数据
*/
private void refreshView() {
//如果用户自定了title和message
if (!TextUtils.isEmpty(title)) {
titleTv.setText(title);
titleTv.setVisibility(View.VISIBLE);
} else {
titleTv.setVisibility(View.GONE);
}
if (!TextUtils.isEmpty(message)) {
messageTv.setText(message);
}
//如果设置按钮的文字
if (!TextUtils.isEmpty(positive)) {
positiveBn.setText(positive);
} else {
positiveBn.setText("确定");
}
if (!TextUtils.isEmpty(negtive)) {
negtiveBn.setText(negtive);
} else {
negtiveBn.setText("取消");
}
if (imageResId != -1) {
imageIv.setImageResource(imageResId);
imageIv.setVisibility(View.VISIBLE);
} else {
imageIv.setVisibility(View.GONE);
}
/**
* 只显示一个按钮的时候隐藏取消按钮,回掉只执行确定的事件
*/
if (isSingle) {
columnLineView.setVisibility(View.GONE);
negtiveBn.setVisibility(View.GONE);
} else {
negtiveBn.setVisibility(View.VISIBLE);
columnLineView.setVisibility(View.VISIBLE);
}
}
@Override
public void show() {
super.show();
refreshView();
}
/**
* 初始化界面控件
*/
private void initView() {
negtiveBn = findViewById(R.id.negtive);
positiveBn = findViewById(R.id.positive);
titleTv = findViewById(R.id.title);
messageTv = findViewById(R.id.message);
imageIv = findViewById(R.id.image);
columnLineView = findViewById(R.id.column_line);
}
/**
* 设置确定取消按钮的回调
*/
public OnClickBottomListener onClickBottomListener;
public CustomDialog setOnClickBottomListener(OnClickBottomListener onClickBottomListener) {
this.onClickBottomListener = onClickBottomListener;
return this;
}
public interface OnClickBottomListener {
/**
* 点击确定按钮事件
*/
void onPositiveClick();
/**
* 点击取消按钮事件
*/
void onNegtiveClick();
}
public String getMessage() {
return message;
}
public CustomDialog setMessage(String message) {
this.message = message;
return this;
}
public String getTitle() {
return title;
}
public CustomDialog setTitle(String title) {
this.title = title;
return this;
}
public String getPositive() {
return positive;
}
public CustomDialog setPositive(String positive) {
this.positive = positive;
return this;
}
public String getNegtive() {
return negtive;
}
public CustomDialog setNegtive(String negtive) {
this.negtive = negtive;
return this;
}
public int getImageResId() {
return imageResId;
}
public boolean isSingle() {
return isSingle;
}
public CustomDialog setSingle(boolean single) {
isSingle = single;
return this;
}
public CustomDialog setImageResId(int imageResId) {
this.imageResId = imageResId;
return this;
}
}

View File

@@ -0,0 +1,109 @@
package com.info.sn.view;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.info.sn.R;
public class InfoDialog extends Dialog {
private InfoDialog(Context context, int themeResId) {
super(context, themeResId);
}
public static class Builder {
private View mLayout;
private ImageView mIcon;
private TextView mTitle;
private TextView mMessage;
private Button mButton;
private View.OnClickListener mButtonClickListener;
private InfoDialog mDialog;
public Builder(Context context) {
mDialog = new InfoDialog(context, R.style.Theme_AppCompat_Dialog);
LayoutInflater inflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//加载布局文件
mLayout = inflater.inflate(R.layout.dialog, null, false);
//添加布局文件到 Dialog
mDialog.addContentView(mLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
mIcon = mLayout.findViewById(R.id.dialog_icon);
mTitle = mLayout.findViewById(R.id.dialog_title);
mMessage = mLayout.findViewById(R.id.dialog_message);
mButton = mLayout.findViewById(R.id.dialog_button);
}
/**
* 通过 ID 设置 Dialog 图标
*/
public Builder setIcon(int resId) {
mIcon.setImageResource(resId);
return this;
}
/**
* 用 Bitmap 作为 Dialog 图标
*/
public Builder setIcon(Bitmap bitmap) {
mIcon.setImageBitmap(bitmap);
return this;
}
/**
* 设置 Dialog 标题
*/
public Builder setTitle(@NonNull String title) {
mTitle.setText(title);
mTitle.setVisibility(View.VISIBLE);
return this;
}
/**
* 设置 Message
*/
public Builder setMessage(@NonNull String message) {
mMessage.setText(message);
return this;
}
/**
* 设置按钮文字和监听
*/
public Builder setButton(@NonNull String text, View.OnClickListener listener) {
mButton.setText(text);
mButtonClickListener = listener;
return this;
}
public InfoDialog create() {
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mDialog.dismiss();
mButtonClickListener.onClick(view);
}
});
mDialog.setContentView(mLayout);
mDialog.setCancelable(true); //用户可以点击后退键关闭 Dialog
mDialog.setCanceledOnTouchOutside(false); //用户不可以点击外部来关闭 Dialog
return mDialog;
}
}
}

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff" />
<stroke
android:width="0.8dp"
android:color="#ffffff" />
<!-- 圆角 -->
<corners android:radius="6dp" />
</shape>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,108 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minWidth="260dp"
android:layout_centerInParent="true"
android:paddingTop="16dp"
android:background="@drawable/bg_dialog"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:id="@+id/image"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:maxWidth="80dp"
android:maxHeight="80dp"
android:layout_marginRight="16dp"
android:visibility="visible"
tools:src="@drawable/bind" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center_vertical"
android:textColor="#333333"
android:textSize="20sp"
android:visibility="visible"
tools:text="消息提示" />
</LinearLayout>
<TextView
android:id="@+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center|left"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:lineSpacingExtra="3dp"
android:lineSpacingMultiplier="1.2"
android:textSize="16dp"
android:textColor="#999999"
tools:text="提示消息提示消息提示消息提示消息提示消息提示消息提示消息提示消息" />
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginTop="16dp"
android:background="#E4E4E4" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/negtive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:layout_weight="1"
android:background="@null"
android:gravity="center"
android:singleLine="true"
tools:text="No"
android:textColor="#999999"
android:textSize="16sp" />
<View
android:id="@+id/column_line"
android:layout_width="1px"
android:layout_height="match_parent"
android:background="#E4E4E4" />
<Button
android:id="@+id/positive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:layout_weight="1"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:background="@null"
android:gravity="center"
android:singleLine="true"
tools:text="Yes"
android:textColor="#38ADFF"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>

View File

@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ffffff">
<LinearLayout
android:id="@+id/dialog_header"
android:orientation="vertical"
android:layout_width="220dp"
android:layout_height="wrap_content"
android:padding="16dp"
android:gravity="center"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
<!-- Icon -->
<ImageView
android:contentDescription="@id/dialog_title"
android:id="@+id/dialog_icon"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/bind" />
<!-- Titledefault is gone) -->
<TextView
android:id="@+id/dialog_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="#ffffff"
android:visibility="gone" />
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
android:gravity="center"
app:layout_constraintTop_toBottomOf="@+id/dialog_header"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent">
<!-- Dialog Message -->
<TextView
android:id="@+id/dialog_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
tools:text="Dialog Message" />
<Button
android:id="@+id/dialog_button"
android:layout_width="100dp"
android:layout_height="42dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="8dp"
android:textColor="#ffffff"
android:text="xx"
>
</Button>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -7,5 +7,17 @@
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="CustomDialog" parent="android:style/Theme.Dialog">
<!--背景颜色及和透明程度-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--是否去除标题 -->
<item name="android:windowNoTitle">true</item>
<!--是否去除边框-->
<item name="android:windowFrame">@null</item>
<!--是否浮现在activity之上-->
<item name="android:windowIsFloating">true</item>
<!--是否模糊-->
<item name="android:backgroundDimEnabled">true</item>
</style>
</resources>