基于android的手机安全卫士实现心得五
完成了通讯卫士功能,接着来做软件管理。
先来说下界面,软件管家主界面有一个标题栏,这个可以根据自己的喜好设置。然后下面是一个RelativeLayout,包含了两个TextView,分别用来显示手机和SD卡可用容量。最后是一个FramLayout,包含一个ListView,用来显示已安装的app的具体信息,还有一个TextView,由来显示用户/系统应用个数。
<?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" ><include layout="@layout/titlebar"/><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="5dp"><TextViewandroid:id="@+id/tv_phonememory_appmanager"style="@style/textview12sp"android:layout_alignParentLeft="true"/><TextViewandroid:id="@+id/tv_sdmemory_appmanager"style="@style/textview12sp"android:layout_alignParentRight="true"/></RelativeLayout><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/lv_appmanager"android:layout_width="match_parent"android:layout_height="match_parent"android:listSelector="@color/transparent"/><TextViewandroid:id="@+id/tv_appnumber"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="5dp"android:textColor="@color/black"android:background="@color/graye5"/></FrameLayout>
</LinearLayout>
然后是每个item的布局
<?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="wrap_content"android:orientation="vertical" ><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="5dp"><ImageViewandroid:id="@+id/imgv_appicon"android:layout_width="50dp"android:layout_height="50dp"/><TextViewandroid:id="@+id/tv_appsize"style="@style/textview16sp"android:layout_marginRight="10dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"/><TextViewandroid:id="@+id/tv_appname"style="@style/textview16sp"android:layout_toRightOf="@+id/imgv_appicon"android:layout_marginLeft="10dp"android:layout_marginTop="5dp"/><TextViewandroid:id="@+id/tv_appisroom"style="@style/textview14sp"android:layout_marginTop="3dp"android:layout_alignLeft="@+id/tv_appname"android:layout_toRightOf="@+id/imgv_appicon"android:layout_below="@+id/tv_appname"/></RelativeLayout><Viewandroid:layout_width="match_parent"android:layout_height="1px"android:background="@color/black30"/><LinearLayoutandroid:id="@+id/ll_option_app"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_marginTop="3dp"android:visibility="visible"><TextViewandroid:id="@+id/tv_launch_app"style="@style/tvyellow14sp"android:drawableTop="@drawable/phoneicon_yellow_n"android:text="启动"/><Viewandroid:layout_width="1px"android:layout_height="match_parent"android:background="@color/black30"/><TextViewandroid:id="@+id/tv_uninstall_app"style="@style/tvyellow14sp"android:drawableTop="@drawable/deleteicon_yellow_n"android:text="卸载"/><Viewandroid:layout_width="1px"android:layout_height="match_parent"android:background="@color/black30"/><TextViewandroid:id="@+id/tv_share_app"style="@style/tvyellow14sp"android:text="分享"android:drawableTop="@drawable/shareicon_yellow_n"/><Viewandroid:layout_width="1px"android:layout_height="match_parent"android:background="@color/black30"/><TextViewandroid:id="@+id/tv_setting_app"style="@style/tvyellow14sp"android:text="设置"android:drawableTop="@drawable/settingicon_yellow_n"/></LinearLayout>
</LinearLayout>
界面完成了,接下来实现逻辑部分
我们要想在我们的界面上显示所有应用的具体信息,首先要得到各个应用,这个可用packagemanager的相关方法来实现。我们要得到的消息有应用的图标,name,是否在手机内存,是否是用户应用,大小。信息很多,所以先建立一个实体类来包含这些信息,以便后面使用。
package com.yangmiaoqing.example.myassitant;import android.graphics.drawable.Drawable;public class AppInfo {/** 应用程序包名 */public String packageName;/** 应用程序图标 */public Drawable icon;/** 应用程序名称 */public String appName;/** 应用程序路径 */public String apkPath;/** 应用程序大小 */public long appSize;/** 是否是手机存储 */public boolean isInRoom;/** 是否是用户应用 */public boolean isUserApp;/** 是否选中,默认都为false */public boolean isSelected = false;/**拿到App位置字符串*/public String getAppLocation(boolean isInRoom) {if (isInRoom) {return "手机内存";} else {return "外部存储";}}}
接着我们来写一个类来获取这些信息,因为我们要把信息填充到ListView中去,肯定要配置adapter,因此我们在这个类里直接写一个返回值是List<AppInfo>类型的函数。在这里,先实例化一个PackageManager pm,然后调用pm.getIntalledPackage来得到所有已安装应用的包
package com.yangmiaoqing.example.myassitant;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;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.packageName = packname;Drawable icon = packInfo.applicationInfo.loadIcon(pm);appinfo. icon = icon;String appname = packInfo.applicationInfo.loadLabel(pm).toString();appinfo.appName = appname;//应用程序apk包的路径String apkpath = packInfo.applicationInfo.sourceDir;appinfo.apkPath = apkpath;File file = new File(apkpath);long appSize = file.length();appinfo.appSize = appSize;//应用程序安装的位置。int flags = packInfo.applicationInfo.flags; //二进制映射 大bit-mapif((ApplicationInfo.FLAG_EXTERNAL_STORAGE & flags)!=0){//外部存储appinfo.isInRoom = false;}else{//手机内存appinfo.isInRoom = true;}if((ApplicationInfo.FLAG_SYSTEM&flags)!=0){//系统应用appinfo.isUserApp = false;}else{//用户应用appinfo.isUserApp = true;}appinfos.add(appinfo);appinfo = null;}return appinfos;}
}
完成这些,我们已经可以实现把已安装的应用显示到我们的界面上了,但是我们要做的还不止于此。将信息显示到界面上之后,我们还可以做一些操作如:启动,卸载,分享,设置权限等。我们先做一个工具类,来做这些事,到时候只需要调用即可。
package com.yangmiaoqing.example.myassitant;import com.stericson.RootTools.RootTools;import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.widget.Toast;/**业务工具类*/
public class EngineUtils {/*** 分享应用*/public static void shareApplication(Context context,AppInfo appInfo) {Intent intent = new Intent("android.intent.action.SEND");intent.addCategory("android.intent.category.DEFAULT");intent.setType("text/plain");intent.putExtra(Intent.EXTRA_TEXT,"推荐您使用一款软件,名称叫:" + appInfo.appName+ "下载路径:https://play.google.com/store/apps/details?id="+ appInfo.packageName);context.startActivity(intent);}/*** 开启应用程序*/public static void startApplication(Context context,AppInfo appInfo) {// 打开这个应用程序的入口activity。PackageManager pm = context.getPackageManager();Intent intent = pm.getLaunchIntentForPackage(appInfo.packageName);if (intent != null) {context.startActivity(intent);} else {Toast.makeText(context, "该应用没有启动界面", 0).show();}}/*** 开启应用设置页面* @param context* @param appInfo*/public static void SettingAppDetail(Context context,AppInfo appInfo) {Intent intent = new Intent();intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");intent.addCategory(Intent.CATEGORY_DEFAULT);// dat=package:com.itheima.mobileguardintent.setData(Uri.parse("package:" + appInfo.packageName));context.startActivity(intent);}/**卸载应用*/public static void uninstallApplication(Context context,AppInfo appInfo) {if (appInfo.isUserApp) {Intent intent = new Intent();intent.setAction(Intent.ACTION_DELETE);intent.setData(Uri.parse("package:" + appInfo.packageName));context.startActivity(intent);}else{//系统应用 ,root权限 利用linux命令删除文件。if(!RootTools.isRootAvailable()){Toast.makeText(context, "卸载系统应用,必须要root权限", 0).show();return ;}try {if(!RootTools.isAccessGiven()){Toast.makeText(context, "请授权黑马小护卫root权限", 0).show();return ;}RootTools.sendShell("mount -o remount ,rw /system", 3000);RootTools.sendShell("rm -r "+appInfo.apkPath, 30000);} catch (Exception e) {e.printStackTrace();}}}
}
RootTools需要下载jar包
然后我们来配置adapter
package com.yangmiaoqing.example.myassitant;import java.util.List;import android.R.anim;
import android.content.Context;
import android.text.format.Formatter;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;public class AppManagerAdapter extends BaseAdapter {private List<AppInfo> UserAppInfos;private List<AppInfo> SystemAppInfos;private Context context;public AppManagerAdapter(List<AppInfo> userAppInfos,List<AppInfo> systemAppInfos, Context context) {super();UserAppInfos = userAppInfos;SystemAppInfos = systemAppInfos;this.context = context;}@Overridepublic int getCount() {// 因为有两个条目需要用于显示用户进程,系统进程因此需要加2return UserAppInfos.size() + SystemAppInfos.size() + 2;}@Overridepublic Object getItem(int position) {if (position == 0) {// 第0个位置显示的应该是 用户程序的个数的标签。return null;} else if (position == (UserAppInfos.size() + 1)) {return null;}AppInfo appInfo;if (position < (UserAppInfos.size() + 1)) {// 用户程序appInfo = UserAppInfos.get(position - 1);// 多了一个textview的标签 ,// 位置需要-1} else {// 系统程序int location = position - UserAppInfos.size() - 2;appInfo = SystemAppInfos.get(location);}return appInfo;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// 如果 position为0,则为TextViewif (position == 0) {TextView tv = getTextView();tv.setText("用户程序:" + UserAppInfos.size() + "个");return tv;// 系统应用} else if (position == (UserAppInfos.size() + 1)) {TextView tv = getTextView();tv.setText("系统程序:" + SystemAppInfos.size() + "个");return tv;}// 获取到当前App的对象AppInfo appInfo;if (position < (UserAppInfos.size() + 1)) {// position 0 为textViewappInfo = UserAppInfos.get(position - 1);} else {// 系统应用appInfo = SystemAppInfos.get(position - UserAppInfos.size() - 2);}ViewHolder viewHolder = null;if (convertView != null & convertView instanceof LinearLayout) {viewHolder = (ViewHolder) convertView.getTag();} else {viewHolder = new ViewHolder();convertView = View.inflate(context, R.layout.item_appmanager_list,null);viewHolder.mAppIconImgv = (ImageView) convertView.findViewById(R.id.imgv_appicon);viewHolder.mAppLocationTV = (TextView) convertView.findViewById(R.id.tv_appisroom);viewHolder.mAppSizeTV = (TextView) convertView.findViewById(R.id.tv_appsize);viewHolder.mAppNameTV = (TextView) convertView.findViewById(R.id.tv_appname);viewHolder.mLuanchAppTV = (TextView) convertView.findViewById(R.id.tv_launch_app);viewHolder.mSettingAppTV = (TextView) convertView.findViewById(R.id.tv_setting_app);viewHolder.mShareAppTV = (TextView) convertView.findViewById(R.id.tv_share_app);viewHolder.mUninstallTV = (TextView) convertView.findViewById(R.id.tv_uninstall_app);viewHolder.mAppOptionLL = (LinearLayout) convertView.findViewById(R.id.ll_option_app);convertView.setTag(viewHolder);}if (appInfo != null) {viewHolder.mAppLocationTV.setText(appInfo.getAppLocation(appInfo.isInRoom));viewHolder.mAppIconImgv.setImageDrawable(appInfo.icon);viewHolder.mAppSizeTV.setText(Formatter.formatFileSize(context,appInfo.appSize));viewHolder.mAppNameTV.setText(appInfo.appName);if (appInfo.isSelected) {viewHolder.mAppOptionLL.setVisibility(View.VISIBLE);} else {viewHolder.mAppOptionLL.setVisibility(View.GONE);}}MyClickListener listener = new MyClickListener(appInfo);viewHolder.mLuanchAppTV.setOnClickListener(listener);viewHolder.mSettingAppTV.setOnClickListener(listener);viewHolder.mShareAppTV.setOnClickListener(listener);viewHolder.mUninstallTV.setOnClickListener(listener);return convertView;}/**** 创建一个TextView* @return*/private TextView getTextView() {TextView tv = new TextView(context);tv.setBackgroundColor(context.getResources().getColor(R.color.graye5));tv.setPadding(DensityUtil.dip2px(context, 5),DensityUtil.dip2px(context, 5),DensityUtil.dip2px(context, 5),DensityUtil.dip2px(context, 5));tv.setTextColor(context.getResources().getColor(R.color.black));return tv;}static class ViewHolder {/** 启动App */TextView mLuanchAppTV;/** 卸载App */TextView mUninstallTV;/** 分享App */TextView mShareAppTV;/** 设置App */TextView mSettingAppTV;/** app 图标 */ImageView mAppIconImgv;/** app位置 */TextView mAppLocationTV;/** app大小 */TextView mAppSizeTV;/** app名称 */TextView mAppNameTV;/** 操作App的线性布局 */LinearLayout mAppOptionLL;}class MyClickListener implements OnClickListener {private AppInfo appInfo;public MyClickListener(AppInfo appInfo) {super();this.appInfo = appInfo;}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.tv_launch_app:// 启动应用EngineUtils.startApplication(context, appInfo);break;case R.id.tv_share_app:// 分享应用EngineUtils.shareApplication(context, appInfo);break;case R.id.tv_setting_app:// 设置应用EngineUtils.SettingAppDetail(context, appInfo);break;case R.id.tv_uninstall_app:// 卸载应用,需要注册广播接收者if(appInfo.packageName.equals(context.getPackageName())){Toast.makeText(context, "您没有权限卸载此应用!", 0).show();return;}EngineUtils.uninstallApplication(context, appInfo);break;}}}
}
我们的adapter继承自BaseAdapter,主要是重写getView方法,用的是ViewHold来填充item
最后我们来接软件管家的Activity
package com.yangmiaoqing.example.myassitant;
import java.util.ArrayList;
import java.util.List;import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.text.format.Formatter;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;public class AppManagerActivity extends Activity implements OnClickListener{/**手机剩余内存TextView*/private TextView mPhoneMemoryTV;/**展示SD卡剩余内存TextView*/private TextView mSDMemoryTV;private ListView mListView;private List<AppInfo> appInfos;private List<AppInfo> userAppInfos = new ArrayList<AppInfo>();private List<AppInfo> systemAppInfos = new ArrayList<AppInfo>();private AppManagerAdapter adapter;/**接收应用程序卸载成功的广播*/private UninstallRececiver receciver;private Handler mHandler = new Handler(){public void handleMessage(android.os.Message msg) {switch (msg.what) {case 10:if(adapter == null){adapter = new AppManagerAdapter(userAppInfos, systemAppInfos, AppManagerActivity.this);}mListView.setAdapter(adapter);adapter.notifyDataSetChanged();break;case 15:adapter.notifyDataSetChanged();break;}};};private TextView mAppNumTV;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_app_manager);//注册广播receciver = new UninstallRececiver();IntentFilter intentFilter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED);intentFilter.addDataScheme("package");registerReceiver(receciver, intentFilter);initView();}/**初始化控件*/private void initView() {findViewById(R.id.rl_titlebar).setBackgroundColor(getResources().getColor(R.color.bright_yellow));ImageView mLeftImgv = (ImageView) findViewById(R.id.imgv_leftbtn);((TextView) findViewById(R.id.tv_title)).setText("软件管家");mLeftImgv.setOnClickListener(this);mLeftImgv.setImageResource(R.drawable.back);mPhoneMemoryTV = (TextView) findViewById(R.id.tv_phonememory_appmanager);mSDMemoryTV = (TextView) findViewById(R.id.tv_sdmemory_appmanager);mAppNumTV = (TextView) findViewById(R.id.tv_appnumber);mListView = (ListView) findViewById(R.id.lv_appmanager);//拿到手机剩余内存和SD卡剩余内存getMemoryFromPhone();initData();initListener();}private void initListener() {mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,final int position, long id) {if (adapter != null) {new Thread(){public void run() {AppInfo mappInfo = (AppInfo) adapter.getItem(position);//记住当前条目的状态boolean flag = mappInfo.isSelected;//先将集合中所有条目的AppInfo变为未选中状态for(AppInfo appInfo :userAppInfos){appInfo.isSelected = false;}for(AppInfo appInfo : systemAppInfos){appInfo.isSelected = false;}if(mappInfo != null){//如果已经选中,则变为未选中if(flag){mappInfo.isSelected = false;}else{mappInfo.isSelected = true;}mHandler.sendEmptyMessage(15);}};}.start();}}});mListView.setOnScrollListener(new OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {if(firstVisibleItem >= userAppInfos.size()+1){mAppNumTV.setText("系统程序:"+systemAppInfos.size()+"个");}else{mAppNumTV.setText("用户程序:"+userAppInfos.size()+"个");}}});}private void initData() {appInfos = new ArrayList<AppInfo>();new Thread(){public void run() {appInfos.clear();userAppInfos.clear();systemAppInfos.clear();appInfos.addAll(AppInfoParser.getAppInfos(AppManagerActivity.this));for( AppInfo appInfo : appInfos){//如果是用户Appif(appInfo.isUserApp){userAppInfos.add(appInfo);}else{systemAppInfos.add(appInfo);}}mHandler.sendEmptyMessage(10);};}.start();}/**拿到手机和SD卡剩余内存*/private void getMemoryFromPhone() {long avail_sd = Environment.getExternalStorageDirectory().getFreeSpace();long avail_rom = Environment.getDataDirectory().getFreeSpace();//格式化内存String str_avail_sd = Formatter.formatFileSize(this, avail_sd);String str_avail_rom = Formatter.formatFileSize(this, avail_rom);mPhoneMemoryTV.setText("剩余手机内存:" + str_avail_rom);mSDMemoryTV.setText("剩余SD卡内存:" + str_avail_sd);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.imgv_leftbtn:finish();break;}}/**** 接收应用程序卸载的广播* @author admin*/class UninstallRececiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {// 收到广播了initData();}}@Overrideprotected void onDestroy() {unregisterReceiver(receciver);receciver = null;super.onDestroy();}
}
在appManageActivity中主要是处理改变Ui事件。在这里,ui改变主要是这么几种情况,第一种是item被选中,第二种是卸载了应用需要重新初始化数据。我们知道,如果要在非主线程中改变ui,要用handle。在handleMessage中有两种情况,第一种就是初始化数据需要全部重新加载;第二种是item的状态改变。在这里需要注册receiver来监测卸载成功的广播。notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容。
在initData中是初始化数据即userAppInfos和systemAppInfos,initlistener中改变item的选中状态。另外,提一下,卸载,设置等的动作以及item被选中后操作选项的显示都是在adapter中完成的
基于android的手机安全卫士实现心得五相关推荐
- 基于Android的手机安全卫士的开发
基于Android的手机安全卫士的开发 开发环境 处理器:Intel® Core™ i5-5200U CPU 2.20GHz 内存:4GB 硬盘:500GB 操作系统:Windows 7中文版,64位 ...
- 基于android平台的手机安全卫士的设计与实现 开题报告,开题报告-基于android的手机安全卫士的设计与开发.doc...
毕业设计开题报告 题 目: 基于Android的手机安全卫士的设计与开发 专 业 计算机科学与技术 学 生 姓 名 班 级 学 号 指 导 教 师 指 导 单 位 电气信息工程学院 专 业 负 责 人 ...
- 基于android的手机安全卫士的实现心得一
毕设是做一个基于android的手机安全助手,因为也是android新手,边学边做,记录一下做个过程和学习心得,以便写毕业论文也方便以后复习.希望能通过这个项目,基本掌握android开发,不至于虚度 ...
- 基于android的手机安全卫士的实现心得二
关于android的第二大组件service Service是Android提供一个允许长时间留驻后台的一个组件,最常见的 用法就是做轮询操作!或者想在后台做一些事情,比如后台下载更新! Activi ...
- android 订餐系统,一种基于Android平台手机订餐系统的实现方法
一种基于Android平台手机订餐系统的实现方法[ 技术领域: ][0001]本发明涉及一种手机订餐系统,能够通过手机上的Android软件实现订餐.[ 背景技术: ][0002]目前已有的网上订餐系 ...
- 张利国,龚海平,王植萌.android移动开发入门与进阶,开题报告-基于Android的手机音乐播放器的设计与实现.doc...
盐城师范学院 毕业设计开题报告 题 目: 基于android的手机音乐播放器 的设计与实现 姓 名: 二级学院: 信息工程学院 专 业: 软件工程 班 级: 12(1) 学 号: 指导教师: 职称: ...
- 茶百科 android 论文,基于android平台手机茶百科开发_学位论文.doc
基于android平台手机茶百科开发_学位论文 摘要 随着智能手机一步步走进普通人的生活,它将成为人们获取信息的主要设备.因此,手机的应用服务将会有很大的发展空间,手机茶百科软件就是其中的一项.And ...
- android宿舍管理系统源码,基于android操作系统的手机宿舍管理系统使用手册
<基于android操作系统的手机宿舍管理系统使用手册>由会员分享,可在线阅读,更多相关<基于android操作系统的手机宿舍管理系统使用手册(5页珍藏版)>请在人人文库网上搜 ...
- php mysql 开发微博_php+mysql基于Android的手机微博应用开发
摘要:本系统采用Eclipse作为开发工具,数据库基于MySQL,服务器的编写使用的是PHP语言,开发了基于Android平台开的C/S模式的手机微博系统.系统从符合操作简便.界面友好.使用灵活.实用 ...
最新文章
- python统计csv行数_对Python 多线程统计所有csv文件的行数方法详解
- Linux-企业邮件部署
- linux透明大页内存,Linux如何禁用透明大页
- WP7之题样式与数据绑定
- 网易云信联合墨刀,邀你参加【产品设计狂欢节】!
- 让皮肤变水嫩的15条小妙招 - 健康程序员,至尚生活!
- html运用以及工具
- android 交叉编译so,Android交叉编译htop和使用方法
- iverilog+gtkwave 进行仿真
- C#调用C++的DLL所有数据类型转换方式
- VS 编译选项如何设置以及对性能的影响1
- 按钮插件和按钮状态切换
- 博科光纤交换机操作手册之三
- java web程序设计任务教程——源码(全)
- 数据不落地、移动新应用、安全更可靠
- 【MySQL学习】数据库问题及着重点汇总
- Bailian2706 麦森数【大数】
- 163免费企业邮箱服务地址
- Unbuntu 安装 TeamViewer14
- jupyter notebook调试流程