Android 基础知识三

来源:互联网 发布:cs1.6弹道优化参数 编辑:程序博客网 时间:2024/06/05 04:22

1 res与assets资源的区别?

android应用可以将资源存储在两个目录:res和assets。其中res目录中的资源只能存储在相应的
子目录(如res/layout、res/values等)中,不能直接将资源存储在res目录中。assets目录中的
资源可以任意存放,也可以建立任意层次的子目录。res和assets资源的主要区别如下。
1、引用资源的方式不同
res目录中的所有资源都会在R类的相应子类中生成对应的int类型变量,需要使用这些变量
来引用资源。例如res/layout/main.xml是布局文件资源,会在R.layout类中生成一个名为main的
变量,所以需要使用R.layout.main来引用main.xml。
assets目录中的资源需要直接使用文件名来引用,例如assets/xyz.xml、assets/abc/test.db是
assets目录中的两个资源文件,其中abc是assets中的子目录。可以使用如下的代码引用这两个资源文件,
并返回与资源文件对应的InputStream对象,剩下的操作就是普通的Java代码输入流操作了。

InputStream is1=getResources().getAssets().open(“xyz.xml”);
InputStream is2=getResources().getAssets().open(“abc/test.db”);

2、处理方式不同
res目录中的资源子目录除了raw外,其他资源目录中的资源文件都会被编译,这也是为什么
将APK文件解压后无法直接查看XML格式资源文件内容的原因。而assets与res/raw目录中的资源
文件不会做任何处理,所以将APK解压后,这两个目录中的资源文件都会保持原样.

3、子目录不同
res目录只能有一层子目录,而且这些子目录必须是预定义的,如res/layout、res/values等都是
合法的,而res/abc,res/xyz并不是合法的资源目录,在assets目录中可以建任意层次的子目录(只受操作系统的限制)

2:怎样退出终止App?

1:Dalvik VM的本地方法

android.os.Process.killProcess(android.os.Process.myPid()) //获取PID
System.exit(0); //常规java、c#的标准退出法,返回值为0代表正常退出

2: 任务管理器方法

首先要说明该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限

ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
系统会将,该包下的 ,所有进程,服务,全部杀掉,就可以杀干净了,要注意加上

3:根据Activity的声明周期

我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标 志 Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。

在A窗口中使用下面的代码调用B窗口

Intent intent = new Intent();
intent.setClass(Android123.this, CWJ.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG设置
startActivity(intent);

接下来在B窗口中需要退出时直接使用finish方法即可全部退出。

3:Include ,Merge、ViewStub的作用。

1、布局重用

1)<include />标签可以使用单独的layout属性,这个也是必须使用的。2)可以使用其他属性。<include />标签若指定了ID属性,而你的layout也定义了ID,则你的layout的ID会被覆盖,解决方案。3)在include标签中所有的Android:layout_*都是有效的,前提是必须要写layout_width和layout_height两个属性。4)布局中可以包含两个相同的include标签。

2、减少视图层级

标签在UI的结构优化中起着非常重要的作用,它可以删减多余的层级,优化UI。多用于替换FrameLayout或者当一个布局包含另一个时,标签消除视图层次结构中多余的视图组。例如你的主布局文件是垂直布局,引入了一个垂直布局的include,这是如果include布局使用的LinearLayout就没意义了,使用的话反而减慢你的UI表现。这时可以使用标签优化。

3、需要时使用

标签最大的优点是当你需要时才会加载,使用他并不会影响UI初始化时的性能。各种不常用的布局想进度条、显示错误消息等可以使用标签,以减少内存使用量,加快渲染速度。是一个不可见的,大小为0的View。

ViewStub目前有个缺陷就是还不支持 标签。

4:Sqlite的基本操作。

SQLiteDatabase类也专门提供了一些函数来操作数据库,有 insert,delete,update,query(),不过这些函数需要的参数比较多,适合对SQL语句不太懂的新手使用,如果想提高自己的水平,那么最好使用exeSQL(),rawQuery()。因为这两个方法比较直观明了、比较省事。

在程序初始化时候,必须先建立数据库以对数据库进行更新,所以这里需要继承一个 SQLiteOpenHelper抽象类,这里有两个方法 onCreate(),onUpgreade()两个方法,前者用来创建数据库及对数据库的一些初始化操作,后者是当数据库版本进行更新时候用。

代码示例:

public class DatebaseHelper extends SQLiteOpenHelper {
public final static String NAME=”MyDB”;
public final static int VERSION=1;
public DatebaseHelper(Context context) {
super(context, NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(“CREATE TABLE User (userID integer primary key autoincrement, userName varchar(20), pwd varchar(12))”);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL(“DROP TABLE IF EXISTS User”);
onCreate(db);
}
}
用SQLiteDatabase来操作SQLite数据库。
public class DatebaseService {
private DatebaseHelper dbHelper;
public DatebaseService(Context context) {
this.dbHelper = new DatebaseHelper(context);
}
//保存数据。
public void save(User user){
SQLiteDatabase db=dbHelper.getWritableDatabase();
db.execSQL(“insert into user(userName,pwd) values(?,?)”, new Object[]{user.getName(),user.getpwd()});

}  

//更新数据
public void update(User user){
SQLiteDatabase db=dbHelper.getReadableDatabase();
db.execSQL(“update user set userName=?,pwd=? where userID=?”, new Object[]{user.getuserName(),user.getpwd(),user.getuserID()});
}
//查找数据
public User find(Integer userID){
SQLiteDatabase db=dbHelper.getReadableDatabase();
Cursor cursor=db.rawQuery(“select * from User where userID=?”,new String[]{userID.toString()} );
while(cursor.moveToNext()){
String name=cursor.getString(cursor.getColumnIndex(“userName”));
int pwd=cursor.getInt(cursor.getColumnIndex(“pwd”));
int id=cursor.getInt(cursor.getColumnIndex(“userID”));
return new User(id,name,pwd);

}  return null;  }  

//删除数据
public void delete(Integer userID){
SQLiteDatabase db=dbHelper.getReadableDatabase();
db.execSQL(“delete from User where userID=?”,new Object[]{userID});
}
public Long getCount(){
SQLiteDatabase db=dbHelper.getReadableDatabase();
Cursor cursor = db.rawQuery(“select count(*) from User”, null);
cursor.moveToFirst();
return cursor.getLong(0);
}

0 0
原创粉丝点击