safe06

1.获取可用的sd卡的空间
File path = Environment.getExternalStorageDirectory(); //获取sd卡的存储目录
        StatFs stat = new StatFs(path.getPath());
        long blockSize = stat.getBlockSize(); //获取Block的内存的大小
        long availableBlocks = stat.getAvailableBlocks(); //获取可用内存的Block的数目
long totalBlocks = stat.getBlockCount(); //获取所有内存的Block的数目
        return Formatter.formatFileSize(this, availableBlocks*blockSize); 通过格式化来获取可用内存的大小

2.获取所有的在手机上安装的应用程序的信息, 包括那些被卸载了的但是没有清空数据的应用程序
  List<PackageInfo> packageInfos = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);

  Drawable appIcon = packageinfo.applicationInfo.loadIcon(pm); 获取了PackageInfo对象后,就可以获取这个应用程序显示的 图标(Drawable对象)
  String appname = packageinfo.applicationInfo.loadLabel(pm).toString(); 获取这个应用程序的名称

3.获取了一个apk文件的 packageinfo 的信息后,就可以获取它的 applicationInfo 信息
  ApplicationInfo applicationInfo = packageinfo.applicationInfo;
 
  applicationInfo.flags 应用程序的标识,每个应用程序都有很多的flags,用来表示应用程序的信息。

4.通知数据适配器更新ui
  adapter.notifyDataSetChanged();

5.反编译步骤:
  1.解压apk文件,得到classes.dex文件,把classes.dex文件拷贝到 dex2jar的文件夹下,
  2.在命令行中切换到 dex2jar 所在的目录,输入 dex2jar classes.dex 命令
  3.在 dex2jar 目录下生成一个 .jar 文件,
  4.运行 jd-gui.exe 文件,用该文件查看 .jar 文件。

6.设置一个 PopupWindow ,弹出的窗口
TextView tv = new TextView(getApplicationContext());
int[] arrayOfInt = new int[2];
tv.setTextSize(20);
tv.setTextColor(Color.RED);
PopupWindow popupWindow = new PopupWindow(tv, 200, 60);
popupWindow.showAtLocation(parent, Gravity.LEFT|Gravity.TOP, arrayOfInt[0], arrayOfInt[1]);

7.给listview注册一个滚动的监听器事件
  lv_app_manager.setOnScrollListener(new OnScrollListener())

8.listview.getItemAtPosition(position) ,获取listview指定位置上的view,返回它的包信息

9.任何一个activity在清单文件里配置了一个
    <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
  就在手机上创建一个快捷方式的图标,打开这个图标就运行这个activity。

10.开启一个应用程序
   private void startApplication(PackInfo info) {
PackageManager pm  = getPackageManager();
try {
// 告诉packagemanger获取activity节点的信息
PackageInfo  packinfo = pm.getPackageInfo(info.getPackname(), PackageManager.GET_ACTIVITIES);
ActivityInfo[] activities =  packinfo.activities;
if(activities!=null&&activities.length>0){
ActivityInfo lunchActivity = activities[0];
Intent intent  = new Intent();
intent.setClassName(packinfo.packageName, lunchActivity.name);
startActivity(intent);
}else{
Toast.makeText(this, "无法启动当前应用", 0).show();
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}
}

11.卸载一个应用程序
   Uri packageUri = Uri.parse("package:"+info.getPackname());
   Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageUri);
   startActivityForResult(uninstallIntent);

12.分享应用程序
Intent localIntent1 = new Intent(Intent.ACTION_SEND);
localIntent1.setType("text/plain");
localIntent1.putExtra("android.intent.extra.SUBJECT", "分享");
StringBuilder localStringBuilder = new StringBuilder("Hi!推荐您使用软件:");
String appname = info.getAppname();
String packname = info.getPackname();
localStringBuilder.append("程序名为:" + appname);
localStringBuilder.append("\n");
localStringBuilder.append("包名为:" + packname);
localIntent1.putExtra("android.intent.extra.TEXT",
localStringBuilder.toString());
Intent.createChooser(localIntent1, "分享");
startActivity(localIntent1);

13.屏幕适配的原则:
1.尽量在布局文件中 使用线性布局或者相对布局  不要使用(绝对布局)
2.在定义控件宽高的时候 尽量的都使用dip的单位 不要使用px单位
                                文字sp(dip)的单位  不用使用px
3.各种布局最外面我们可以包裹一个 ScrollView 解决小屏幕手机的适配问题.

14.PackageManager 相当于windows下的程序管理器
   管理的内容是静态的,(安装到系统的所有程序)

15.ActivityManager 相当于windows下的进程管理器
   管理的是动态的内容

16.获取系统所有当前正在运行的服务
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningServiceInfo> serviceInfos = am.getRunningServices(100);
for (RunningServiceInfo info : serviceInfos) {
serviceName = info.service.getClassName();
}

17.获得正在运行的任务栈名字
   List<RunningTaskInfo> infos = am.getRunningTasks(3);
   RunningTaskInfo taskinfo = infos.get(0);
   System.out.println(taskinfo.topActivity.getPackageName());

18.获取手机系统内存
StatFs stat = new StatFs("/data");
        long blockSize = stat.getBlockSize(); //获取Block的内存的大小
        long availableBlocks = stat.getAvailableBlocks(); //获取可用内存的Block的数目
long totalBlocks = stat.getBlockCount(); //获取所有内存的Block的数目
        return Formatter.formatFileSize(this, availableBlocks*blockSize); 通过格式化来获取可用内存的大小

19.设置TextView的文本只显示一行:android:singleLine="true"
当TextView的文本的内容超过定义的最大长度时,可以android:ellipsize="end" 让后面显示“...”
android:ellipsize="start"  让前面显示“...”
设置TextView的最长宽度,maxWidth="200dp"

20.短信的备份,其实就是:
1.短信是在内容提供者里存储的,uri为 content://sms/
通过context.getContentResolver().query(....),来查询所有的短信的内容,返回一个 cursor
2.遍历cursor结果集,用XmlSerializer,把获取到的内容写到 backup.xml文件里

21.短信的还原,就是:
1.用XmlPullParser来解析backup.xml文件,把解析到的数据封装成一个smsInfo对象,
2.用ContentValues values = new ContentValues();
values.put("date", info.getDate());
values.put("address", info.getAddress());
values.put("type", info.getType());
values.put("body", info.getBody());
3.将数据再插入到短信的内容提供者里,(通过uri来插入)
context.getContentResolver().insert(uri, values);

22.可用系统内存和sd卡内存
通过 StatFs stat = new StatFs("/data"); 获得系统的StatFs对象
File path = Environment.getExternalStorageDirectory(); 获取sd卡的存储目录
StatFs stat = new StatFs(path.getPath()); 再获取sd卡的StatFs对象

23.系统应用程序和用户程序区分:
1. 系统应用程序是在 /system/app 目录下
用户程序是在 /data/app 目录下
2.手机设置里 “已下载” 显示的程序也就是用户程序。
通过找出所有"已下载"的程序,即可找出所有的用户程序 如下方法所示:三方应用的过滤器

24./**
* 三方应用的过滤器 ,如
* @return true 三方应用 false 系统应用
*/
public boolean filterApp(ApplicationInfo info) {
if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { //当系统应用程序升级的时候,它可能就变成了一个用户程序
return true;
} else if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
return true;
}
return false;
}

25.获取这个view在当前窗体的x,y坐标,
int[] arrayOfInt = new int[2]; 定义一个int类型的数组,包含两个参数
view.getLocationInWindow(arrayOfInt); 把这个int数组作为参数传递到这个方法中,调用完这个方法后,就会把x,y坐标的值放到这个int数组中。

26.定义一个弹出窗体
设置缩放动画
ScaleAnimation sa = new ScaleAnimation(0.4f, 1.0f, 0.4f, 1.0f);
a.setDuration(800);
1.弹出一个窗体,设置它的内容,窗体的宽高
popupWindow = new PopupWindow(textview, 220, 80);
2.重要: popupwindow 一定要设置背景 如果不设置背景,会导致很多问题(动画不会播放);
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
3.popupWindow显示的位置,第二个参数左上对齐,第三个参数是指,当前view的x坐标再加上50,第四个参数是指 view的y坐标的值
popupWindow.showAtLocation(parent, Gravity.LEFT | Gravity.TOP,arrayOfInt[0] + 50), arrayOfInt[1]);
textview.startAnimation(sa);

27.popupWindow.isShowing(); popupWindow是否正在显示

28.给listview注册一个滚动的监听事件
listview.setOnScrollListener(....);

29.listview的setOnItemClickListener()中,别的方法要想知道点击的条目的位置,可以定义一个成员变量currentposition,
然后把这个监听器里的方法的position传递给currentposition。

30.程序锁的原理
1.定义一个看门狗,实际上就是开启一个线程,获取当前正在运行的程序的包名,代码如下:
1.获取当前正在运行的程序(进程)
ActivityManager am = (ActivityManager)Context.getSystemService(ACTIVITY_SERVICE);
2.通过am获取正在运行的任务栈
List<RunningTaskInfo> infos = am.getRunningTasks(3);
3.获取最近打的任务栈信息
RunningTaskInfo taskinfo = infos.get(0);
4.获取正在运行的程序的包名
taskinfo.topActivity.getPackageName();
2.根据这个包名(也就是进程)判断是不是要保护的程序,如果是的话,则打开的时候弹出一个输入密码的对话框。

猜你喜欢

转载自xpchou.iteye.com/blog/1637550