手機安全衛士——主界面的開發

来源:http://www.cnblogs.com/mengxiao/archive/2017/02/04/6365760.html
-Advertisement-
Play Games

activity_home.xml home_list_item.xml style.xml color.xml HomeActivity.java 知識點: GirdView + BaseAdapter+點擊事件 自定義TextView ...


activity_home.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView  
        android:id="@+id/text1"     
        style="@style/TitleStyle"
        android:text="功能列表" />
//自定義TextView 強制有焦點 <com.mxn.mobilesafe.view.FocusedTextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/black" android:textSize="22sp" android:text="新消息: 今日。。。。。" android:singleLine="true" //展示一行 android:ellipsize="marquee"//走馬燈。。start省略前面的內容。。 android:layout_marginTop="10dp" android:layout_marginBottom="10dp" />
//給TextView加上這兩行代碼,也可以實現走馬燈
<!-- android:focusableInTouchMode="true" -->
<!-- android:focusable="true" -->

<GridView android:id="@+id/gv_home" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:verticalSpacing="30dp" android:numColumns="3" >//展示3列 </GridView> </LinearLayout>
FocusedTextView.java 
//自定義TextView,獲取焦點的TextView
public class FocusedTextView extends TextView{

  //有style樣式的會走此方法
    public FocusedTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
    }
  //有屬性時的會走此方法
    public FocusedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }
   //用代碼new對象時走此方法
    public FocusedTextView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }
    
    @Override
    public boolean isFocused() {
        // 表示是否獲取焦點,走馬燈要運行,首先調用此函數,判斷是否有焦點,是true,走馬燈才會有效果。強制返回true
        return true;
    }

}

home_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/iv_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/home_apps" />
    

    <TextView
        android:id="@+id/tv_item"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:textColor="@color/black"
        android:textSize="20sp"
        />

</LinearLayout>

style.xml

<resources>
<style name="TitleStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">100dp</item>
        <item name="android:background">#8866ff00</item>
        <item name="android:textColor">@color/black</item>
        <item name="android:gravity">center</item>
        <item name="android:textSize">22sp</item>
    </style>
</resources>

color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="black">#000</color>
    
</resources>

HomeActivity.java

public class HomeActivity extends Activity {

    private GridView gvHome;

    private String[] mItems = new String[] { "手機防盜", "通訊衛士", "軟體管理", "進程管理", "流量統計", "手機殺毒", "緩存清理", "高級工具", "設置中心" };

    private int[] mPics = new int[] { R.drawable.home_safe, R.drawable.home_callmsgsafe, R.drawable.home_apps,
            R.drawable.home_taskmanager, R.drawable.home_netmanager, R.drawable.home_trojan,
            R.drawable.home_sysoptimize, R.drawable.home_tools, R.drawable.home_settings };

    private SharedPreferences mPref;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        mPref = getSharedPreferences("config", MODE_PRIVATE);

        gvHome = (GridView) findViewById(R.id.gv_home);
        gvHome.setAdapter(new HomeAdapter());

        // 設置每一項的監聽點擊事件
        gvHome.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                switch (position) {
                case 0:
                    // 手機防盜
                    showPasswordDialog();
                    break;
                case 8:
                    // 設置中心
                    startActivity(new Intent(HomeActivity.this, SettingActivity.class));
                    break;
                case 7:
                    //高級工具
                    startActivity(new Intent(HomeActivity.this, AtoolsActivity.class));
                    break;
                case 1:
                    //通訊衛士,黑名單
                    startActivity(new Intent(HomeActivity.this,CallSafeActivity.class));
                    break;
                case 2:
                    //軟體管理
                    startActivity(new Intent(HomeActivity.this,AppManagerActivity.class));
                    break;
                case 3:
                    //進程管理
                    startActivity(new Intent(HomeActivity.this,TaskManagerActivity.class));
                    break;
                case 5:
                    //病毒查殺
                    startActivity(new Intent(HomeActivity.this,AntivirusActivity.class));
                    break;
                    
                case 6:
                    //緩存清理
                    startActivity(new Intent(HomeActivity.this,CleanCacheActivity.class));
                    break;
                    
                case 4:
                    //流量管理
                    startActivity(new Intent(HomeActivity.this,TrafficManagerActivity.class));
                default:
                    break;
                }
            }
        });
    }

    /**
     * 顯示密碼彈窗
     */
    protected void showPasswordDialog() {
        // 判斷是否設置密碼
        String savedPassword = mPref.getString("password", null);
        if (!TextUtils.isEmpty(savedPassword)) {
            // 輸入密碼彈窗
            showPasswordInputDialog();
        } else {
            // 如果沒有設置過, 彈出設置密碼的彈窗
            showPasswordSetDailog();
        }
    }

    /**
     * 輸入密碼彈窗
     */
    private void showPasswordInputDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        final AlertDialog dialog = builder.create();

        View view = View.inflate(this, R.layout.dialog_input_password, null);
        // dialog.setView(view);// 將自定義的佈局文件設置給dialog
        dialog.setView(view, 0, 0, 0, 0);// 設置邊距為0,保證在2.x的版本上運行沒問題

        final EditText etPassword = (EditText) view.findViewById(R.id.et_password);

        Button btnOK = (Button) view.findViewById(R.id.btn_ok);
        Button btnCancel = (Button) view.findViewById(R.id.btn_cancel);

        btnOK.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                String password = etPassword.getText().toString();

                if (!TextUtils.isEmpty(password)) {
                    String savedPassword = mPref.getString("password", null);

                    if (MD5Utils.encode(password).equals(savedPassword)) {
                        // Toast.makeText(HomeActivity.this, "登錄成功!",
                        // Toast.LENGTH_SHORT).show();
                        dialog.dismiss();

                        // 跳轉到手機防盜頁
                        startActivity(new Intent(HomeActivity.this, LostFindActivity.class));
                    } else {
                        Toast.makeText(HomeActivity.this, "密碼錯誤!", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(HomeActivity.this, "輸入框內容不能為空!", Toast.LENGTH_SHORT).show();
                }
            }
        });

        btnCancel.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                dialog.dismiss();// 隱藏dialog
            }
        });

        dialog.show();
    }

    /**
     * 設置密碼的彈窗
     */
    private void showPasswordSetDailog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        final AlertDialog dialog = builder.create();

        View view = View.inflate(this, R.layout.dialog_set_password, null);
        // dialog.setView(view);// 將自定義的佈局文件設置給dialog
        dialog.setView(view, 0, 0, 0, 0);// 設置邊距為0,保證在2.x的版本上運行沒問題

        final EditText etPassword = (EditText) view.findViewById(R.id.et_password);
        final EditText etPasswordConfirm = (EditText) view.findViewById(R.id.et_confirm);

        Button btnOK = (Button) view.findViewById(R.id.btn_ok);
        Button btnCancel = (Button) view.findViewById(R.id.btn_cancel);

        btnOK.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                String password = etPassword.getText().toString();
                String passwordConfirm = etPasswordConfirm.getText().toString();
                // password!=null && !password.equals("")
                if (!TextUtils.isEmpty(password) && !passwordConfirm.isEmpty()) {
                    if (password.equals(passwordConfirm)) {
                        // Toast.makeText(HomeActivity.this, "登錄成功!",
                        // Toast.LENGTH_SHORT).show();

                        // 將密碼保存起來
                        mPref.edit().putString("password", MD5Utils.encode(password)).commit();
                        dialog.dismiss();
                        // 跳轉到手機防盜頁
                        startActivity(new Intent(HomeActivity.this, LostFindActivity.class));
                    } else {
                        Toast.makeText(HomeActivity.this, "兩次密碼不一致!", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    Toast.makeText(HomeActivity.this, "輸入框內容不能為空!", Toast.LENGTH_SHORT).show();
                }
            }
        });

        btnCancel.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                dialog.dismiss();// 隱藏dialog
            }
        });

        dialog.show();
    }

class HomeAdapter extends BaseAdapter { @Override public int getCount() { return mItems.length;//展示多少數據 } @Override public Object getItem(int position) { return mItems[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) {
//載入佈局 View view
= View.inflate(HomeActivity.this, R.layout.home_list_item, null);
//獲取到每一項的具體內容 ImageView ivItem
= (ImageView) view.findViewById(R.id.iv_item); TextView tvItem = (TextView) view.findViewById(R.id.tv_item); //給girdview的每一項具體內容設置內容 tvItem.setText(mItems[position]); ivItem.setImageResource(mPics[position]);
//返回當前的position項
return view; } } }

 dialog_set_password.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:background="#66ff6600"
        android:padding="20dp"
        android:textSize="20sp"
        android:text="設置密碼" />

    <EditText
        android:id="@+id/et_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="請輸入密碼"
        android:inputType="textPassword" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/et_confirm"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="請再次輸入密碼"
        android:inputType="textPassword" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/btn_ok"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="確定" />

        <Button
            android:id="@+id/btn_cancel"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="取消" />

    </LinearLayout>

</LinearLayout>

dialog_input_password.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:background="#66ff6600"
        android:padding="20dp"
        android:textSize="20sp"
        android:text="輸入密碼" />

    <EditText
        android:id="@+id/et_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="請輸入密碼"
        android:inputType="textPassword" >

        <requestFocus />
    </EditText>

   
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/btn_ok"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="確定" />

        <Button
            android:id="@+id/btn_cancel"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="取消" />

    </LinearLayout>

</LinearLayout>

MD5Utils.java

public class MD5Utils {
    
    public static String encode(String password){
        StringBuffer sb = new StringBuffer();
        MessageDigest instance;
        try {
            instance = MessageDigest.getInstance("MD5");
            byte[] digest = instance.digest(password.getBytes());//對字元串加密返回加密後的位元組數組
            for(byte b:digest){
                int i = b&0xff;//獲取位元組的八位有效值
                String hexString = Integer.toHexString(i);//將一個整數轉化為16進位
                System.out.println(hexString);
                
                if(hexString.length()<2){
                    hexString = "0"+hexString;
                }
                sb.append(hexString);
                return sb.toString();//MD5是32位的,返回加密後的字元串。。此演算法不可逆
            //MD5線上查詢破解  www.cmd5.com..只是對一些常用的密碼可以解密
            
        } }catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
//沒有該演算法時 拋出異常
e.printStackTrace(); } return ""; } //獲取到文件的MD5 public static String getFileMd5(String sourceDir) throws Exception { // TODO Auto-generated method stub File file = new File(sourceDir); StringBuffer sb = new StringBuffer(); try { FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int len = -1; //獲取到數字摘要 MessageDigest messageDigest = MessageDigest.getInstance("md5"); while((len = fis.read(buffer)) != -1){ messageDigest.update(buffer,0,len); } byte[] result = messageDigest.digest(); for(byte b:result){ int i = b&0xff; String hexString = Integer.toHexString(i); System.out.println(hexString); if(hexString.length()<2){ hexString = "0"+hexString; } sb.append(hexString); } }catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return sb.toString(); }}

 

知識點:

GirdView + BaseAdapter+點擊事件

自定義TextView

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • iOS 獲取西曆、農曆日期的年月日 介紹三種方法獲取 Date (NSDate) 的年月日。 用 date 表示當前日期。測試日期為西曆 2017 年 2 月 5 日,農曆丁酉年,雞年,正月初九。 獲取西曆年月日 用 Calendar (NSCalendar) 獲取西曆年月日 結果 用 Calend ...
  • 微信公眾平臺有4類賬號:訂閱號、服務號、企業號及小程式。訂閱號和服務號統稱為公眾號。 訂閱號的註冊主體可以為個人,但現在已關閉個人認證。服務號的註冊主體不能為個人。 在介面許可權方面,服務號比訂閱號多支持以下介面:模板消息(業務通知)、獲取用戶地理位置、生成帶參數的二維碼、長鏈接轉短鏈接介面、語義理解... ...
  • git詳解 git是從android出現,就作為版本管理工具。由於很多人從svn開始使用,簡單的check in & check out操作,很難理解和適應通過命令行操作的git的管理。 所以很多人繼續使用圖形界面的git管理工具,尤其android studio自帶git的圖形操作界面,使得很多人 ...
  • Activity Activity 本文內容 創建 Activity 實現用戶界面 在清單文件中聲明 Activity 啟動 Activity 啟動 Activity 以獲得結果 結束 Activity 管理 Activity 生命周期 實現生命周期回調 保存 Activity 狀態 處理配置變更 ...
  • 示例代碼: view.setTag(R.string.action_settings,hodler.content); 接收兩個值,一個是key值,必須是唯一值,而且要寫在values/string.xml 裡面,例如 <resources> <item type ="id" name = "fff ...
  • 英文原文:Picking your compileSdkVersion, minSdkVersion, and targetSdkVersion 作者:Ian Lake,Google Android 推廣工程師;翻譯:南韓愷。 當你發佈一個應用之後,(取決於具體的發佈時間)可能沒過幾個月 Andro ...
  • 安卓常用數據存儲方式之一SQLite學習及操作筆記 0.視頻地址:http://www.imooc.com/video/3382 1.每個程式都有自己的資料庫 預設情況下是各自互不幹擾 1)創建一個資料庫並且打開; 2)使用游標cursor相當於存儲結果的集合,可理解為list; 3)結束後必須釋放 ...
  • 基本結構圖(重要) Director: 有那些作用? OpenGL ES的初始化,場景的轉換,游戲暫停繼續的控制,世界坐標和GL坐標之間的切換,對節點(游戲元素)的控制,游戲數據的保存調用,屏幕尺寸的獲取 控制場景的常用方法 runWithScene( Scene *scene ) 啟動游戲,並運行 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...