android学习笔记

1、将XML文件转化为一个View控件:
View view = View.inflate(MainActivity.this, R.layout.list_item, null);
2、使用ListView显示数据库的内容:以MVC方式(数据、视图、控制器)
lv = (ListView) this.findViewById(R.id.lv);
PersonDao dao = new PersonDao(this);
persons = dao.findAll();
//找到persons 数据,ListView视图,最后调用setAdapter方法配置数据适配器
lv.setAdapter(new MyAdapter());//MyAdapter继承BaseAdapter方法
3、使用ArrayAdapter适配器:适用于显示一组String或者其他类型的数组
lv.setAdapter(new ArrayAdapter<String>(this,R.layout.list_item, R.id.tv, names));
4、使用SimpleAdapter数据适配器,使用与多组可变数据List<Map<String,Object>>
lv.setAdapter(new SimpleAdapter(this, list , R.layout.list_item, new String[]{"textname","iconid"},new int[]{R.id.tv,R.id.iv}));
//list绑定的数据,List集合
//R.layout.list_item数据显示对应的布局
//要让数据和View 对象建立一个映射关系
//from[]  map集合里面数据的key
//to[]  布局文件里面的id
5、内容提供者,提供给其他应用程序数据库信息,程序中定义内容提供者类
//还需要在清单文件里面配置provider
public class PersonDBProvider extends ContentProvider {
private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
public static final int INSERT = 1;
public static final int DELETE = 2;
public static final int UPDATE = 3;
public static final int QUERY = 4;
private PersonSQLiteOpenHelper helper = null;
static{
//添加一组匹配规则
matcher.addURI("com.example.database.personprovider", "insert", INSERT);
matcher.addURI("com.example.database.personprovider", "delete", DELETE);
matcher.addURI("com.example.database.personprovider", "update", UPDATE);
matcher.addURI("com.example.database.personprovider", "query", QUERY);
}
}
//其他应用程序中取得内容提供者
ContentResolver resolver  = this.getContentResolver();
6、数据备份到SD卡,同时要加上用户写SD卡的权限
XmlSerializer serializer = Xml.newSerializer(); //XML序列化类
File file = new File(Environment.getExternalStorageDirectory(),"backup2.xml");
FileOutputStream fos = new FileOutputStream(file);
serializer.setOutput(fos, "utf-8");

serializer.startDocument("utf-8", true);
serializer.startTag(null, "smss");
for(SmsInfo info:smsinfos){
serializer.startTag(null, "sms");
serializer.attribute(null, "id", info.getId()+"");

serializer.startTag(null, "body");
serializer.text(info.getBody());
serializer.endTag(null, "body");

serializer.startTag(null, "address");
serializer.text(info.getAddress());
serializer.endTag(null, "address");

serializer.startTag(null, "type");
serializer.text(info.getType()+"");
serializer.endTag(null, "type");

serializer.startTag(null, "date");
serializer.text(info.getDate()+"");
serializer.endTag(null, "date");

serializer.endTag(null, "sms");
}
serializer.endTag(null, "smss");
serializer.endDocument();
fos.close();
7、启动进程,5秒之后写入数据
new Thread(){
public void run(){
try {
Thread.sleep(5000);
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://sms/");
ContentValues values = new ContentValues();
values.put("address", "95533");
values.put("type", 1);
values.put("date", System.currentTimeMillis());
values.put("body", "hahhaahmiemiemieamlfasjdk");
resolver.insert(uri, values);
} catch (Exception e) {
e.printStackTrace();
}
}; 
}.start();
8、内容观察者:
ContentResolver resolver = this.getContentResolver();
Uri uri = Uri.parse("content://sms/");
resolver.registerContentObserver(uri, true, new MyObserver(new Handler()));
//注册一个内容观察者,当内容改变时候调用onChange方法
private class MyObserver extends ContentObserver{
public void onChange(boolean selfChange) {}
}
9、当数据改变的时候发出通知,然后内容观察者通过URI观察到消息
context.getContentResolver().notifyChange(uri, null);
10、ANR:application not response 应用程序无响应
anr参数的原因:主线程需要做很多重要的事情,响应点击事件,更新UI
如果主线程里面阻塞过久的时间,应用程序就会无响应,为了避免应用程序出现anr,所以耗时的操作都应该放在子线程里面执行
11、谁创建的view对象谁才能动它,只有主线程才能修改view对象
内部实现更新界面的时候会做一个检查,更新完UI后,检查这个更新的操作是否在主线程的代码中执行,
如果是,没有任何问题,如果不是,立即抛出一个运行时异常
//1、主线程的消息处理器
private Handler handler = new Handler(){
@Override
//处理消息
public void handleMessage(Message msg) {
if(msg.what == CHANGE_UI){
Bitmap bitmap = (Bitmap) msg.obj;
iv.setImageBitmap(bitmap);
}else if(msg.what == ERROR){
Toast.makeText(MainActivity.this, "显示图片失败", 0).show();
}
}
};
//告诉主线程一个消息帮我修改界面,内容是bitmap
Message msg = new Message();
msg.what = CHANGE_UI;
msg.obj = bitmap;
handler.sendMessage(msg);
12、读取InputStream中的数据返回String类型
public static String readInputStream(InputStream is){
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while((len = (is.read(buffer))) != -1){
baos.write(buffer, 0, len);
}
byte[] result = baos.toByteArray();
is.close();
baos.close();
return new String(result);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
13、54-->65视频
14、显示意图:必须要指定开启组件的具体信息(包名。组件名,组件的class)
打开另一个Activity
Intent intent = new Intent();
intent.setClassName(this, "com.example.twoactivity.OtherScreenActivity");
startActivity(intent);
另一种打开另一个Activity的方法:
Intent intent = new Intent(this, OtherScreenActivity.class);
startActivity(intent);
15、判断是否连接网络:
ConnectivityManager cm = (ConnectivityManager) this.getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if(info != null && info.isConnected()){}
16、隐式意图  描述动作的行为
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
17、隐式意图设置action data category
<intent-filter >
               <action android:name="com.example.xxx"/>
               <data android:scheme="example" android:mimeType="vnd.android.cursor.item/haha"/>
               <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
//打开另一个Activity,设置intent值
Intent intent = new Intent();
intent.setAction("com.example.xxx");
intent.addCategory("android.intent.category.DEFAULT");//附加的信息
intent.setDataAndType(Uri.parse("example:hahaha"), "vnd.android.cursor.item/haha");
startActivity(intent);
//获得激活本Activity的Intent
Intent intent = this.getIntent();
String str = intent.toString();
System.out.println(str);
18、在同一个应用程序里面,自己激活自己的东西,推荐使用显示视图,效率高
不同的程序里面激活别人的应用,或者让自己的某一个界面希望被别人激活,推荐使用隐式视图。
(1)查询系统里面所有的activity看看是否有满足条件的activity
(2)有,判断多少个,只有1个,直接启动,如果有多个,列表方式
(3)如果没有,应用程序异常终止,activity not found exception
19、创建对话框的构造器,并设置点击事件
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("提醒");
builder.setMessage("当前网络不可用,点击确定设置网络");
builder.setPositiveButton("确定", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setClassName("com.android.gallery", "com.android.camera.GalleryPicker");
startActivity(intent);
}
});
builder.create().show();
20、SmsSender*****
21、Intent intent = new Intent(this,SeleceContactActivity.class);
//开启新的activity
//startActivity(intent);
//开启一个新的activity 并且获得这个新开启的activity执行完毕后返回的结果
startActivityForResult(intent, 0);
//当新开启的activity关闭的时候调用的方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if(data!=null){
String number = data.getStringExtra("number");
et_number.setText(number);
}
}

//给listview的条目设置一下点击事件
lv_select_contact.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
ContactInfo con = contactInfos.get(position);
String number = con.getNumber();
//传递数据给调用他的activity
Intent data = new Intent();
data.putExtra("number", number);
setResult(0, data);
//关闭当前的activity,然后传递数据给调用这  调用者就会执行onActivityResult的方法
finish();
}
});












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值