Android系统防火墙开发一(2)主界面实现
来源:互联网 发布:录音文件编辑软件 编辑:程序博客网 时间:2024/06/05 23:42
正如上面的一篇开篇所看到的一样,应用程序的主界面上部分有自定义控件圆形构成,下面是通过详细分析原理实现。
如所示:
上半部分是一个自定义控件,下面部分使用的是九宫格格式的内容,整个布局通过FrameLayout布局构成。
下面来简单介绍一下原理吧!
首先看一下布局代码:
activity_test.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android_custom="http://schemas.android.com/apk/res/com.example.afhq" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" > <include android:id="@+id/titleId" layout="@layout/titlebar" /> <RelativeLayout android:id="@+id/relativeLayout1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/titleId" android:background="#2bc0ac" android:gravity="clip_horizontal" > <com.example.afhq.widget.RoundProgressBar android:id="@+id/roundProgressBar2" android:layout_width="180dip" android:layout_height="180dip" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:background="#2bc0ac" android_custom:roundColor="@android:color/white" android_custom:roundProgressColor="@color/battery_view_text_light" android_custom:roundWidth="6dip" android_custom:textColor="@android:color/white" android_custom:textSize="25sp" /> </RelativeLayout> <TextView android:id="@+id/textView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/relativeLayout1" android:layout_centerHorizontal="true" android:background="#2bc0ac" android:gravity="center" android:text="上次体检时间:20:20" android:textColor="@color/black" /> <RelativeLayout android:id="@+id/re_button1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#2bc0ac" android:layout_below="@id/textView1" android:gravity="clip_horizontal" > <Button android:id="@+id/button1" style="@style/logout_edit_text" android:layout_width="match_parent" android:layout_height="40dip" android:layout_marginLeft="100dip" android:layout_marginRight="100dip" android:text="一键体检" /></RelativeLayout> <!-- 具体其他功能和扫描项目页面 --> <FrameLayout android:id="@+id/activity_test_frag" android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_below="@id/re_button1" > </FrameLayout></RelativeLayout>
如上代码可以看出首页布局代码,关于FrameLayout 实现切换布局的原理:
在代码中可以看出:FrameLayout 就是讲不通的页面放到一个容器中,实现切换;下面项目的需要设计,当然关于FrameLayout 原理实现我觉得要去看看源码和基础教程了。
下面看MainActivity.java 实现主界面的构建功能
public class MainActivity extends FragmentActivity { private RoundProgressBar mRoundProgressBar5; private int progress = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); ImageView im =(ImageView) findViewById(R.id.titleBarRightImage_setting); im.setVisibility(View.VISIBLE); //设置界面 im.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(); intent.setClass(getApplicationContext(), SettingCenterActivity.class); startActivity(intent); } }); mRoundProgressBar5 = (RoundProgressBar) findViewById(R.id.roundProgressBar2); mRoundProgressBar5.setDefaultStr("一键体检"); mRoundProgressBar5.setLogoStr(""); mRoundProgressBar5.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startScanningListFragment(); new Thread(new Runnable() { @Override public void run() { while(progress <= 100){ progress += 3; System.out.println(progress); mRoundProgressBar5.setProgress(progress); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); Date date= new Date(); SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String da=s.format(date); ((TextView)findViewById(R.id.textView1)).setText(da); } }); ((Button)findViewById(R.id.button1)).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { ((Button)findViewById(R.id.button1)).setText("正在体检"); new Thread(new Runnable() { @Override public void run() { while(progress <= 100){ progress += 3; System.out.println(progress); mRoundProgressBar5.setProgress(progress); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } }); HomeFragment homeFragment=new HomeFragment(); getSupportFragmentManager() .beginTransaction() .replace(R.id.activity_test_frag, homeFragment, "").commit(); } public void startScanningListFragment(){ ScanningListFragment scanningListFragment=new ScanningListFragment(); getSupportFragmentManager().beginTransaction(). replace(R.id.activity_test_frag, scanningListFragment).commit(); } /** * */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ return super.onKeyDown(keyCode, event); } return super.onKeyDown(keyCode, event); }}
当然,每一个fragment的类可以有很多共同的操作,将这共同的操作方法方放在一个举出的base里面,
BaseFragment.java
package com.example.afhq.base;import android.app.Activity;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public abstract class BaseFragment extends Fragment { public View view; public Activity context; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); context=getActivity(); } @Override //设置当前界面view public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view=initView(); return view; } //填充 数据的操作 @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initData(); } //数据填充UI的方法 public abstract void initData(); //预设UI public abstract View initView() ;}
每一个fragment都要继承basefragment,然后实现抽象方法。
主页下面的九宫格就是通过这种形式,实现一个HomeFragment.java的
package com.example.afhq.fragment;import android.content.Intent;import android.view.View;import android.view.View.OnClickListener;import android.widget.LinearLayout;import android.widget.Toast;import com.example.afhq.R;import com.example.afhq.activity.AntiVirusActivity;import com.example.afhq.activity.LockAppActivity;import com.example.afhq.activity.MessageInterceptActivity;import com.example.afhq.activity.RublishcleanActivity;import com.example.afhq.activity.TasksActivity;import com.example.afhq.activity.TrafficManagerActivity;import com.example.afhq.base.BaseFragment;import com.lidroid.xutils.ViewUtils;import com.lidroid.xutils.view.annotation.ViewInject;public class HomeFragment extends BaseFragment { @ViewInject(R.id.fragment_main_trojan) private LinearLayout fragment_main_trojan;//木马查杀 @ViewInject(R.id.messagee_linearlayout)//短信拦截 private LinearLayout messagee_linearlayout; @ViewInject(R.id.traffice_manager) private LinearLayout traffice_manager;//流量监控 @ViewInject(R.id.ll_rubbish) private LinearLayout ll_rubbish; @ViewInject(R.id.task_insert_layer)//软件管理 private LinearLayout task_insert_layer; @ViewInject(R.id.main_layout_applock) private LinearLayout main_layout_applock; @Override public void initData() { fragment_main_trojan.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent =new Intent(); intent.setClass(getActivity(), AntiVirusActivity.class); startActivity(intent); } }); messagee_linearlayout.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent =new Intent(); intent.setClass(getActivity(), MessageInterceptActivity.class); startActivity(intent); } }); //流量监控 traffice_manager.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {// TrafficManagerActivity Intent intent=new Intent(); intent.setClass(context, TrafficManagerActivity.class); startActivity(intent); } }); /** * */ ll_rubbish.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(); intent.setClass(context, RublishcleanActivity.class); startActivity(intent); } }); task_insert_layer.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(); intent.setClass(context, TasksActivity.class); startActivity(intent); } }); main_layout_applock.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(); intent.setClass(context, LockAppActivity.class); startActivity(intent); } }); } @Override public View initView() { view= View.inflate(getActivity(), R.layout.fragment_main, null); ViewUtils.inject(this,view); return view; }}
说到这,上面的布局代码就是这么多,下面就是关于核心的业务需求了,在图上我们可以看出,当点击上面的一键体检的时候,我们需要获取扫描数据,扫描垃圾,扫描卸载残留,扫描大文件,扫描非官方文件,通过定时器实现扫描,下面就是关于扫描的具体代码。
package com.example.afhq.engine;import java.io.File;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.content.pm.ApplicationInfo;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.graphics.drawable.Drawable;import com.example.afhq.domain.AppInfo;public class AppInfoParser { /** * 获取手机里面的所有的应用程序 * @param context 上下文 * @return */ public static List<AppInfo> getAppInfos(Context context){ //得到一个java保证的 包管理器。 PackageManager pm = context.getPackageManager(); List<PackageInfo> packInfos = pm.getInstalledPackages(0); List<AppInfo> appinfos = new ArrayList<AppInfo>(); for(PackageInfo packInfo:packInfos){ AppInfo appinfo = new AppInfo(); String packname = packInfo.packageName; appinfo.setPackname(packname); Drawable icon = packInfo.applicationInfo.loadIcon(pm); appinfo.setIcon(icon); String appname = packInfo.applicationInfo.loadLabel(pm).toString(); appinfo.setName(appname); //应用程序apk包的路径 String apkpath = packInfo.applicationInfo.sourceDir; appinfo.setApkpath(apkpath); File file = new File(apkpath); long appSize = file.length(); appinfo.setAppSize(appSize); //应用程序安装的位置。 int flags = packInfo.applicationInfo.flags; //二进制映射 大bit-map int uid=packInfo.applicationInfo.uid; appinfo.setUid(uid); if((ApplicationInfo.FLAG_EXTERNAL_STORAGE&flags)!=0){ //外部存储 appinfo.setInRom(false); }else{ //手机内存 appinfo.setInRom(true); } if((ApplicationInfo.FLAG_SYSTEM&flags)!=0){ //系统应用 appinfo.setUserApp(false); }else{ //用户应用 appinfo.setUserApp(true); } appinfos.add(appinfo); appinfo = null; } return appinfos; } public static List<AppInfo> getUserAppInfos(Context context){ //得到一个java保证的 包管理器。 PackageManager pm = context.getPackageManager(); List<PackageInfo> packInfos = pm.getInstalledPackages(0); List<AppInfo> appinfos = new ArrayList<AppInfo>(); for(PackageInfo packInfo:packInfos){ AppInfo appinfo = new AppInfo(); String packname = packInfo.packageName; appinfo.setPackname(packname); Drawable icon = packInfo.applicationInfo.loadIcon(pm); appinfo.setIcon(icon); String appname = packInfo.applicationInfo.loadLabel(pm).toString(); appinfo.setName(appname); //应用程序apk包的路径 String apkpath = packInfo.applicationInfo.sourceDir; appinfo.setApkpath(apkpath); File file = new File(apkpath); long appSize = file.length(); appinfo.setAppSize(appSize); //应用程序安装的位置。 int flags = packInfo.applicationInfo.flags; //二进制映射 大bit-map int uid =packInfo.applicationInfo.uid; appinfo.setUid(uid); if((ApplicationInfo.FLAG_EXTERNAL_STORAGE&flags)!=0){ //外部存储 appinfo.setInRom(false); }else{ //手机内存 appinfo.setInRom(true); } if((ApplicationInfo.FLAG_SYSTEM&flags)!=0){ //系统应用 //appinfo.setUserApp(false); }else{ appinfos.add(appinfo); //用户应用 appinfo.setUserApp(true); } appinfo = null; } return appinfos; }}
以上就是简单的介绍一下关于扫描的,主要内容还是在代码中,需要小伙伴们自己去研究一下代码。
阅读全文
0 0
- Android系统防火墙开发一(2)主界面实现
- Android系统防火墙开发一(1)功能介绍
- CSS 实现 系统登录界面 (一)
- 网络防火墙系统的实现(一)
- Android应用界面开发(一)
- Android新闻客户端开发2--主界面业务逻辑实现
- 【Android UI设计与开发】1.引导界面(一)ViewPager介绍和简单实现
- Android应用开发系列(一):splash引导界面开发
- Android开发(25)--framebyframe帧动画并实现启动界面到主界面的跳转
- 实现新闻发布系统(一)登陆界面
- Android系统开发一
- Android界面(一)
- Android界面(一)
- 网络防火墙系统的实现(二)
- 网络防火墙系统的实现(三)
- (转载)Android开发=》打开系统设置(信息)界面
- 标签栏主界面实现(一)
- 从零开始开发Android版2048 (一)初始化界面
- 关于C单链表的面试题(进阶题)
- String 堆内存和栈内存
- 537. Complex Number Multiplication
- 读书记录
- 操作系统之线程实现
- Android系统防火墙开发一(2)主界面实现
- linux注册系统服务
- css选择器
- jquery遍历list的Json串
- _access()函数检测文件或文件夹是否存在,_mkdir()创建目录。
- 1012. Greedy Snake (35)解题报告
- Mybatis的一些总结
- 从GTID复制模式在线切换到传统模式
- C#串口操作类