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,
        };

至此,添加完毕。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值