功能/知识点 | 概念 含义 思路 | 注意事项 |
Apppwidget 生命周期 | 创建开始 销毁结束,有序的方法 on | 优化timer+servcie |
网易 多种格式appwidget | 配置多个reciever 公式 70xn -30 |
|
短信的备份与还原 帮助用户找回短信 | 1.获取短信集合 2.生成xml XmlSerilizer序列化器 3.PullParser 解析标签 | Uri: 访问地址 ContentResolver:内容解析者 ContentProvider:内容提供者 Cursor:游标 多条数据记录的集合 |
监听器: 获取参数 | 入门 :控件+监听器 创建监听器:1.代码抽取 2.接口: 3.内部对监听器进行传值 | 1.interface 2.On...Listener 3.on.. 4.setOn..Listener |
AsyncTask | Thread+Handler 比方:洗衣服 任务开始:onPreexecute();初始化 任务中:doInbackground();耗时代码 不能更新ui publishProgress提交参数给界面 onProgressUpdate:更新界面 任务后:onPostExecute();显示数据 | 一定要调用execute(); Thread_start(); |
程序锁: 1.小孩子 2.隐私 | 1.名单 2.后台监控程序:看门
FragmentAcvity:Fragment的集合 Fragmetnmanager:管理者打开事务 FragmentTransaction:事务 begine commit | Fragment:类似Activity 比Activity更灵活 a.继承 Fragmnet b.重写 oncreateView c.显示 <fragment 当作控件 d.代码: 事务当作集合
已经安装应用程序集合获取 PackasgeManager TranslateAnimation移动动画 加锁:表中添加记录 解锁: 表中删除记录 |
1. 短信备份与还原
需求:帮助用户找回丢失的短信。
备分:
① 取出集合
http://blog.csdn.net/lo5sea/article/details/38308513
a. 配置权限READ_SMS
b. 获取地址
c. 获取Contentresolver
d. 获取游标
e. 转换成集合
<span style="font-size:14px;"><span style="font-size:14px;">/**
* 读取sms应用的短信
* @param context
* @return
*/
public static List<SmsInfo> findAll(Context context) {
List<SmsInfo> list = new ArrayList<SmsInfo>();
// a.配置权限READ_SMS
// b.获取地址
Uri uri = Uri.parse("content://sms");
// c.获取Contentresolver
ContentResolver resolver = context.getContentResolver();
// d.获取游标
// select address,date,body,type from sms ;
// Cursor cursor=resolver.query(uri, 查询字段, 查询条件, 条件参数, 排序);
Cursor cursor = resolver.query(uri, new String[] { "address", "date", "body", "type" }, null, null, null);
// e.转换成集合
while (cursor.moveToNext()) {
// sqlite是一个弱类型
SmsInfo bean = new SmsInfo();
bean.number = cursor.getString(cursor.getColumnIndex("address"));
bean.date = cursor.getString(cursor.getColumnIndex("date"));
bean.body = cursor.getString(cursor.getColumnIndex("body"));
bean.type = cursor.getString(cursor.getColumnIndex("type"));
list.add(bean);
}
cursor.close();
return list;
}</span></span>
② 写成xml
③ 封装 处理:将可能发生变的代码进行抽象 1.抽象类:包含抽象方法的类 2.接口:只包含抽象方法的interface
a. 抽取出代码成方法
b. 注释方法 申明监听器添加方法
c. 监听器做参数传给工具 对象
d. 监听器内部就可获取参数
<span style="font-size:14px;"><span style="font-size:14px;">// ListView OnItemClicListener
public static interface OnProgressListener {
public void onStart(int max);
public void onProgressChanged(int progress);
public void onEnd(int progress);
}
/**
* 备份短信的 Thread+Handler AsyncTask
* 监听器 就是一个抽象的接口 获取参数
* 一般要求方法 类型 为接口
* @param context
*/
public static void backSms(Context context, OnProgressListener listener) {
int process = 0;
try {
List<SmsInfo> list = SmsUtils.findAll(context);// 20000
int max = list.size();
if(listener!=null)
{
listener.onStart(max);
}
// 指定 位置 mnt/sdcard/sms_back.xml
File saveFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/sms_back.xml");
Log.i("wzx", saveFile.getAbsolutePath());
saveFile.createNewFile();
// 获取序列化器
XmlSerializer writer = Xml.newSerializer();
FileOutputStream fos = new FileOutputStream(saveFile);
// 文件头<?xml version="1.0" encoding="utf-8"?>
writer.setOutput(fos, "utf-8");
writer.startDocument("UTF-8", true);
// <sms-list count=100>
String namespace = null;
writer.startTag(namespace, "sms-list");
// 生成属性
writer.attribute(namespace, "count", list.size() + "");
for (SmsInfo bean : list) {
// <sms>
writer.startTag(namespace, "sms");
// <address>...</address
writer.startTag(namespace, "address");
writer.text(bean.number);
writer.endTag(namespace, "address");
// <date>..
writer.startTag(namespace, "date");
writer.text(bean.date);
writer.endTag(namespace, "date");
// <body
writer.startTag(namespace, "body");
writer.text(bean.body);
writer.endTag(namespace, "body");
// <type
writer.startTag(namespace, "type");
writer.text(bean.type);
writer.endTag(namespace, "type");
// </sms>
writer.endTag(namespace, "sms");
++process;
Thread.sleep(500);// 显示效果
if(listener!=null)
{
listener.onProgressChanged( process);
}
Log.i("wzx", bean.number + " 内容 :" + bean.body);
}
// <sms-list>
writer.endTag(namespace, "sms-list");
if(listener!=null)
{
listener.onEnd(process);
}
writer.endDocument();// 保存
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// ListView OnItemClicListener
public static interface OnProgressListener {
public void onStart(int max);
public void onProgressChanged(int progress);
public void onEnd(int progress);
}
// private static void onEnd(Handler handler, int process) {
// Message msg2 = new Message();
// msg2.what = 2;
// msg2.obj = process;
// handler.sendMessage(msg2);
// }
//
// private static void onProgressChanged(Handler handler, int process) {
// // 通知界面更新
// Message msg1 = new Message();
// msg1.what = 1;
// msg1.obj = process;
// handler.sendMessage(msg1);
// }
//
// private static void onStart(Handler handler, int max) {
// Message msg = new Message();
// msg.what = 0;
// msg.obj = max;
// handler.sendMessage(msg);// ---handleMessage
// }</span></span>
还原:
读取xml pull解析
写短信应用ContentResole
3.1. AsyncTask
synchronized 同步 线程安全方面的关键字
ASynchronized 异步 以子线程的方式运行
概念:android 提供一个 Thread+hanlder的轻量级
按照回调的想法。把 任务分过进程分割 1.开始 2.中间 3.结束
<span style="font-size:14px;">@OnClick(R.id.sms_back)
public void sms_back(View view) {
//第二个参数 publishProgress
new AsyncTask<Void, Integer, Void>(){
//任务: 1.控件初始化状态 进度条显示
protected void onPreExecute() {
dialog=new ProgressDialog(AToolsActivity.this);
dialog.setTitle("备份短信");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setProgress(0);
dialog.setMax(100);
dialog.show();
};
//任务中更新进度
protected void onProgressUpdate(Integer[] values) {
dialog.setProgress(values[0]);
};
private int myMax=0;
private int myprogress=0;
//2.任务中 耗时 修改进度
@Override
protected Void doInBackground(Void... params) { 只有该运行在子线程 需要publishProgress提交数据到界面更新
OnProgressListener listener=new OnProgressListener() {
@Override
public void onStart(int max) {
myMax=max;
}
@Override
public void onProgressChanged(int progress) {
//200 11
//100 5.5
myprogress=progress*100/myMax;
publishProgress(myprogress);//在任务中提交给界面进行更新
}
@Override
public void onEnd(int progress) {
}
};
SmsUtils.backSms(getBaseContext(), listener);
return null;
}
//3.完成 进度隐藏
protected void onPostExecute(Void result) {
dialog.dismiss();
Toast.makeText(getBaseContext(), "备份完成!共"+(int)(myprogress*myMax/100)+"条", 0).show();
};
}.execute();//execute();-->Thread. start
}</span>
好处是:
1.Thread+handler 只用一个类搞定
2.过程比较清楚分过三个阶段。
4. 程序锁
需求:
1.家长通过对某些程序的加锁,监管小孩的上网行为。
2.保护软件不被其它人打开。
4.1. 加锁名单
1) 创建Activity a.继承 b.重写 c.配置 d.启动
selector选择: 管理素材根据状态 显示(press select enable)
2) 添加事件
3) 内容切换Fragment
概念Fragment
Fragment 片段 | 1. android 3.0以后 出现大屏设备 5inch 7inch 10inch tv 2. 提供一个兼容 android-support-v4.jar Fragment 3. 可以“看作”是一个 不需要配置的Activity 4. 比Actvity本身更灵活 5. 一个Activity可以包含多个Framgent Actvivity FragmentActivity 支持Framgent显示的 集合 Fragment 元素 控件 |
Activivty | Fragment |
1.继承Activity 2.重写 3.配置 4.启动 | 1.继承Fragment 2.重写 onCreateView 3.配置 4.添加 页面 |
使用fragment标签显示Fragment
思考 :“当用控件来布局”
<fragment
android:layout_width="50dp"
android:layout_height="50dp"
class="com.itheima.fragment.HelloWorldFragment" />
使用代码添加
思考:”操作 List add remove”
FragmentManager | Fragment管理者 添加 删除 替换 显示 隐藏 查找 以事务管理 片段 |
事务: 以begin开头 以 commit 确认结束 | mysql 管理多个操作 转账 解决纠纷1.全部成功 2.全部失败 班长500 update account set value=value-500 where id=’班长’ 我 update account set value=value+500 where id=’我’ |
FragmentTransaction | 事务 添加 删除 替换 |
绑定源代码
1.创建同名的.properties
2.配置src 指向源代码
3.关闭 打开工程
src=C:\\Users\\itheima\\Desktop\\itheima_softs\\adt-bundle-windows-x86_64_20140101\\sdk\\extras\\android\\support\\v4\\src
4.1.1. Fragment显示软件信息
<span style="font-size:14px;"><span style="font-size:14px;">public class UnlockFragment extends Fragment {
ListView listview_unlock;
LinearLayout wait1;
List<ApkInfo> list;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// getActivity()获取"集合"即Fragment所在的FragmentActivity
View view = View.inflate(getActivity(), R.layout.fragment_unlock, null);
// 列表控件
listview_unlock = (ListView) view.findViewById(R.id.listview_unlock);
wait1 = (LinearLayout) view.findViewById(R.id.wait1);
list = new ArrayList<ApkInfo>();
// 集合
new AsyncTask<Void, Void, Void>() {
protected void onPreExecute() {
wait1.setVisibility(View.VISIBLE);
AppLockActivity activity = (AppLockActivity) getActivity();
activity.updateSoft(list.size());
};
// 任务中 Thread_run 耗时代码
@Override
protected Void doInBackground(Void... params) {
List<ApkInfo> temp = ApkUtils.findAll(getActivity());
list.clear();
list.addAll(temp);
return null;
}
// 任务完成
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
wait1.setVisibility(View.GONE);
// 调用Activity
AppLockActivity activity = (AppLockActivity) getActivity();
activity.updateSoft(list.size());
ApkApdater adapter = new ApkApdater();
// 显示Adapter
listview_unlock.setAdapter(adapter);
}
}.execute();// Thread_start
return view;
}
// 显示未加锁
private class ApkApdater extends BaseAdapter {
// 返回行数
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
// 返回行视图 显示指定下标的数据
class ViewHolderLock {
public ImageView icon;
public TextView appname;
public TextView lock;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// start--view
View view = null;
ViewHolderLock holder = null;
if (convertView == null) {
holder = new ViewHolderLock();
view = View.inflate(getActivity(), R.layout.view_item_soft_unlock, null);
holder.icon = (ImageView) view.findViewById(R.id.icon);
holder.appname = (TextView) view.findViewById(R.id.appname);
holder.lock = (TextView) view.findViewById(R.id.lock);
view.setTag(holder);
} else {
view = convertView;
holder = (ViewHolderLock) view.getTag();
}
// start--end
ApkInfo info = list.get(position);
holder.icon.setImageDrawable(info.appIcon);
holder.appname.setText(info.appName);
return view;
}
}
}</span></span>
4.1.2. 删除特效
<span style="font-size:14px;"><span style="font-size:14px;">final View itemView=view;
final int deleteIndex=position;
OnClickListener clickListener = new OnClickListener() {
@Override
public void onClick(View v) {
// 动画
// 1.TranslateAnimation
TranslateAnimation ta = new TranslateAnimation//
(TranslateAnimation.RELATIVE_TO_SELF, 0.0f, //x 开始
TranslateAnimation.RELATIVE_TO_SELF, 1.0f, //x结束
TranslateAnimation.RELATIVE_TO_SELF, 0.0f, //y开始
TranslateAnimation.RELATIVE_TO_SELF, 0.0f);//y结束
// 2.开始 结束
ta.setDuration(1000);
// 3.时长 1000
itemView.startAnimation(ta);
// 4.删除条目
new Thread(){
public void run() {
try {
Thread.sleep(1000);
list.remove(deleteIndex);
handler.post(new Runnable() {//new Message-->sendMessage-->handleMessage r.run();
@Override
public void run() {
if(adapter!=null)
{
adapter.notifyDataSetChanged();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
};
holder.lock.setOnClickListener(clickListener);</span></span>
4.1.3. 加锁解锁
加锁 | 解锁 |
1.包名 添加到表 2.从集合中删除 刷新界面 3.下一次查询 过滤 已加锁
| 1. 包名 从表中删除 2. 从集合中删除 刷新界面 3. 下一次查询 过滤 未加锁 |