zoukankan      html  css  js  c++  java
  • Android4.4 SystemUI加入Dialog弹窗

    此弹窗为开机SystemUI的显示弹窗:

    首先。在SystemUI的源代码文件夹加入源代码类文件,文件夹为frameworks/base/packages/SystemUI/src/com/android/systemui/settings,类名暂取为UpdateUI.java内容例如以下:

    /*
     * Copyright (C) 2008 The Android Open Source Project
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */

    package com.android.systemui.settings;

    import android.app.ActivityManager;
    import android.app.ActivityManager.RunningTaskInfo;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.app.XXDialog;
    import android.content.BroadcastReceiver;
    import android.content.ComponentName;
    import android.content.ContentResolver;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnDismissListener;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.net.Uri;
    import android.os.UserHandle;
    import android.provider.Settings;
    import android.util.Slog;
    import android.view.View;
    import android.view.MotionEvent;
    import android.view.WindowManager;
    import android.widget.Button;
    import android.widget.TextView;

    import com.android.systemui.R;
    import com.android.systemui.SystemUI;
    import android.app.XXDialog.ButtonClickListener;

    import java.io.FileDescriptor;
    import java.io.PrintWriter;
    import java.util.Arrays;
    import java.util.List;

    public class UpdateUI extends SystemUI {
        static final String TAG = "UpdateUI";
        static final String ACTION = "android.hm.WITH_UPGRADE_ICON";
        static final String sourceFlag = "from_check_service";
        static final String forceFlag = "force";
        static final String Update = "com.XX.ota.MainActivity";

        private static boolean fromService = false;
        private static boolean forceUpdate = false;
        private String vers;

        private SharedPreferences sp;
        XXDialog mUpdateDialog;
        TextView mUpdateTextView;

        private long mScreenOffTime = -1;

        public void start() {
            // Register for Intent broadcasts for...
            IntentFilter filter = new IntentFilter();
            filter.addAction(ACTION);
            mContext.registerReceiver(mIntentReceiver, filter, null, null);
        }

        private boolean shouldShow(final String str) {

    //此处处理广播过来的数据字段,如若与已存在xml的数据同样,则不再提示弹窗,否则弹窗并更新xml数据。


            sp = mContext.getSharedPreferences("version", Context.MODE_PRIVATE);
            String version = sp.getString("version", "");
            if (!str.equals(version)) {
                Editor ed = sp.edit();
                ed.putString("version", vers);
                ed.commit();

                return true;
            }

            return false;
        }

        private boolean getTopWindow() {
            ActivityManager am = (ActivityManager)(mContext).getSystemService(Context.ACTIVITY_SERVICE);
            ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
            Slog.e(TAG, "activity: " + cn.getClassName().toString());
            if (cn.getClassName().contains(Update))
                return true;
                
            return false;
        }

        private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (action.equals(ACTION)) {
                    fromService = intent.getBooleanExtra(sourceFlag, false);
                    forceUpdate = intent.getBooleanExtra(forceFlag, false);
                    vers = intent.getStringExtra("version");
                    if (fromService && !getTopWindow()) {
                        if (forceUpdate) {
                            showUpdateDialog(forceUpdate);
                            return;
                        } else if (shouldShow(vers)) {
                            showUpdateDialog(forceUpdate);
                            return;
                        }
                    }
                }
            }
        };

        void dismissUpdateDialog() {
            if (mUpdateDialog != null) {
                mUpdateDialog.dismiss();
                mUpdateDialog = null;
            }
        }

        void showUpdateDialog(final boolean bool) {
            Slog.e(TAG, "==== show update dialog ====");

    //此Dialog为第三方加入的于framework的标准dialog,在android.app.XXDialog中。


            XXDialog.Builder b = new XXDialog.Builder(mContext);
            XXDialog dialog = b.create();
            dialog.setRightButtonName(mContext.getString(R.string.sure));
            dialog.setLeftButtonName(mContext.getString(R.string.cancel));
            dialog.setContent(mContext.getString(R.string.update_notice));
            dialog.setTitle(mContext.getString(R.string.system_update));
            dialog.notCloseOnTouch();
            if (bool) {
                dialog.setLeftButtonVisible(false);
                dialog.setMiddleLineVisible(false);
            }

            final Intent intent = new Intent();
            ComponentName comp = new ComponentName("com.XX.ota",
                    "com.XX.ota.MainActivity");
            intent.setComponent(comp);
            intent.setAction("android.intent.action.VIEW");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (intent.resolveActivity(mContext.getPackageManager()) != null) {
                dialog.setClickListener(new ButtonClickListener(){
                    
                    @Override
                    public void rightClick() {
                        mContext.startActivityAsUser(intent, UserHandle.CURRENT);
                        dismissUpdateDialog();
                    }
                    
                    @Override
                    public void leftClick() {
                        if (!bool)
                            dismissUpdateDialog();
                    }
                });
            }

            dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            dialog.getWindow().getAttributes().privateFlags |=
                    WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
            dialog.show();
            mUpdateDialog = dialog;
        }

    }

    而后。将该类加入至SystemUI开机启动的service类名列表中:

    改动文件frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java

        private final Class<?>[] SERVICES = new Class[] {
                com.android.systemui.recent.Recents.class,
                com.android.systemui.statusbar.SystemBars.class,
                com.android.systemui.usb.StorageNotification.class,
                com.android.systemui.power.PowerUI.class,
                com.android.systemui.media.RingtonePlayer.class,
                com.android.systemui.settings.SettingsUI.class,
                com.android.systemui.settings.UpdateUI.class,
                com.android.systemui.net.NetWorkWarningUI.class,
            };

    至此。加入完成。。


  • 相关阅读:
    java 环境变量
    maven配置国内镜像库
    swagger ui
    jenkins systemctl启动失败
    gradle 错误
    jenkins 自动构建gitlab项目
    git
    Spinnaker 介绍
    openstack 基础服务软件安装配置(queens,centos-7)
    openstack-nova(queens)
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6801201.html
Copyright © 2011-2022 走看看