Android notes
本文最后更新于121天前,其中的信息可能已经有所发展或是发生改变。

Android应用程序设计提纲

备注:以下所有属性均省略了命名空间android:

一句话解释:

什么是Context(上下文)?

当我们断章取义的去理解一句话的时候,会发现没办法理解。

所以要完整的理解就必须结合文章的上下文。

一段程序如果不完整,当然就无法运行。

在Android中我们可以将Context理解为环境。

环境中啥都有:

比如空气、生物、土壤……

对应到程序中就是外部变量、对象…..

要获取结果,就需要从环境中获取。

例如:

//创建Intent对象,指定启动的类名SecondActivity

Intent intent=new Intent(MainActivity.this,SecondActivity.class);

//启动Activity

startActivity(intent);

Intent(启动Activity的上下文,需要启动的Activity类名)

要实现Activity跳转,那必然是要基于当前的MainActivity。

所以没有MainActivity作为基础,就不能实现跳转。

1. 第一章 Android入门

【知识点】

  1. 1.1.3 Android系统架构
    • 应用程序层(Application)使用Java编写应用程序
    • 应用程序框架层(Application Framework) 提供API
    • 系统运行库层(Libraries)包含核心类库。
    • Linux内核层(Linux Kernel) Android系统基于Linux内核
  2. 1.3.2项目文件
  • 布局文件(主要用于展示Android项目的界面)
  • Activity文件(主要用于完成界面的交互功能)

(3)1.3.3 Android项目结构

  • src

– 各种资源文件

– AndroidManifest.xml文件

– 开发时用到的Activity

  • res

– Layout文件

– values目录文件

– drawable文件夹

  • libs

– 第三方JAR包

  • build

– 各种源文件

– R.Java文件

  1. 1.3.4 AndroidManifest.xml

是每个Android项目所必须的,是对整个Android应用的全局描述。

包含:

记忆关键词(包组版权)

  • 应用程序的包名
  • 应用程序的组件
  • 应用程序的版本要求
  • 应用程序使用到的权限。

2. 第二章 Android应用界面

【知识点】

(1)2.2布局管理器

掌握线性布局、相对布局的相应的标签名及常用的属性的含义。

<RelativeLayout 相对布局

默认生成的布局类型

layout_alignParentTop 是否对齐父布局顶部

></RelativeLayout>

<LinearLayout 线性布局

orientation(朝向)=”horizontal(水平)/vertical(垂直)”

></LinearLayout>

(2)2.3 Android控件详解

掌握各个控件的标签名及常用的属性。

<TextView 文本框

layout_width=”wrap_content” 宽度适应内容

layout_height=”wrap_content” 高度适应内容

textColor 设置字体颜色

textSize 设置字体大小

gravity=”center” 设置字体居中显示

/>

<EditText 输入框

inputType属性设置输入的类型

hint属性提示用户当前文本框输入什么内容

/>

<Button 按钮

background 为按钮设置背景样式

text 设置button的显示的内容(所有内容组件都有此属性)

/>

<ImageView 图像视图

src 设置图片来源

/>

<RadioButton 单选按钮(类似于收音机的按钮,按一个就会弹起一个)

RadioButton通常和RadioGroup(理解为容器,可以往里塞单个单个的RadioButton组件)一起使用。

checked 指定RadioButton初始时是否被选中

/>

<CheckBox 复选框

checked 指定CheckBox初始时是否被选中

/>

<ProgressBar 进度条

max 设置进度条的最大值

progress 设置进度条已完成进度值

/>

<SeekBar 拖动条

thumb 指定滑块外观

/>

掌握ListView与ArrayAdapter的综合运用,参考实例一(P33)。

<ListView (以垂直列表的形式显示所有列表项)

>

使用步骤:

记忆方法:Lvae

  1. 在布局文件中添加ListView组件
  2. 在values文件夹下添加新的arrays.xml文件
  3. 在ListView组件中通过entries属性设置,把数组元素加载到ListView中

</ListView>

实例:基于ArrayAdapter创建ListView

  1. 界面布局基于数组创建ListView的布局代码一样。(id设置为listview1)
  2. Activity代码(即Java后置代码)
  3. 在MainActivity类onCreate方法中书写

ListView listView=findViewById(R.id.listview1);

//定义一个数组,用来填充listview

String[] arr={“章节1″,”章节2″,”章节3”};

//实例化泛型操作类ArrayAdapter

ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,arr);

//为listview设置adapter

listView.setAdapter(adapter);

  1. 创建ArrayAdapter需要指定的三个参数
  2. Context this
  3. textViewResourceId android.R.layout.simple_expandable_list_item_1
  4. 数组/List arr
    1. Toast的使用(Toast.makeText)

记忆此段代码:

Toast.makeText(this,”要显示的文字”,Toast.LENGTH_SHORT).show();

makeText()方法参数的含义:

  1. 上下文环境
  2. 要显示的文字
  3. 显示时间的长短
  4. 第三章 Activity

【知识点】

  1. Activity的创建(能灵活运用)
  2. 定义一个类继承自android.app.Activity或其子类
  3. 在res/layout目录下创建一个xml文件,用于创建Activity的布局
  4. 在app/manifest目录下的AndroidManifest.xml清单文件中注册Activity
  5. 覆写Activity的onCreate()方法,并在该方法中使用setContentView()加载指定的布局文件。例如:

setContentView(R.layout.activity_main);

  1. Activity的三种状态及回调方法。

三种状态:(Run Pause Stop—RPS)

  • 运行状态
  • 暂停状态
  • 停止状态

Activity从一种状态变到另一种状态需要用到回调方法。

回调方法:(CSRRSD)

  • onCreate() Activity的实例被Android系统创建后第一个调用。设置屏幕布局、初始化数据、事件处理
  • onStart() Acitivity可见时执行
  • onRestart() 再次可见时执行
  • onResume() Activity获取焦点时执行
  • onPause() Activity失去焦点时执行
  • onStop() 进入后台时执行
  • onDestroy() Activity销毁时执行
  1. Activity的单击事件(能灵活运用)

Button button=findViewById(R.id.buttton);

//匿名内部类方式

button.setOnClickListener(new View.OnClickListener(){

        @Override

        public void onClick(View view){

            //点击后执行的逻辑代码

        }

    });

(4)3.2.2 显示Intent(掌握页面跳转的方法)

//创建Intent对象,指定启动的类名SecondActivity

Intent intent=new Intent(MainActivity.this,SecondActivity.class);

//启动Activity

startActivity(intent);

Intent()构造方法参数:

– 启动Activity的上下文

– 需要启动的Activity类名

(5)3.3 Activity中的数据传递方式,参考3.4用户注册案例

传递参数

传递较少参数

intent调用putExtra()将数据存储进去。

传递较少参数

String str=”android”;

Intent intent=new Intent(this,SecondActivity.class);

//传递参数

//putExtra()是以key-value的形式

intent.putExtra(“rec”,str);

startActivity(intent);

//SecondActivity接收参数

Intent intent=this.getIntent();

String receive=intent.getStringExtra(“rec”);

传递较多参数

//使用Intent传递多个参数

Intent intent=new Intent(this,SecondActivity.class);

Bundle bundle=new Bundle();

//以key-value的形式

bundle.putString(“name”,”渣渣辉”);

bundle.putString(“sex”,”男”);

//bundle作为容器装载了数据

//intent作为通信媒介

intent.putExtras(bundle);

//启动Activity

startActivity(intent);

Bundle是用来传递数据的“容器”,它保存的数据,是以key-value(键值对)的形式存在的。

必知必会:

Bundle相当于传递数据的“容器”,它保存的数据,是以key-value(键值对)的形式存在的。

bundle实例是容器

intent实例是通信媒介

接收参数:

//在SecondActivity中取出参数

Intent intent=this.getIntent();

Bundle bundle=intent.getExtras();

//根据key取出value

String name=bundle.getString(“name”);

String sex=bundle.getString(“sex”);

4. 第四章 Android事件处理

【知识点】

  1. 基于监听的事件处理(参照图4-1实例)

实现OnClickListener接口

public class MainActivity extends Activity implements View.OnClickListener{

    Button button=findViewById(R.id.button);

    @Override

    public void OnClick(View view){

        //逻辑代码

    }

}

使用匿名内部类的方式注册事件监听器

Button button=findViewById(R.id.buttton);

//匿名内部类方式

button.setOnClickListener(new View.OnClickListener(){

        @Override

        public void onClick(View view){

            //点击后执行的逻辑代码

        }

    });

  1. Ansync Task异步类的作用及常用的方法。

作用:

  1. 实现多线程
  2. 异步通信、消息传递

用例:

获取网络数据、动态更改UI界面

AsyncTask使用步骤:

1. 创建 AsyncTask 子类

2. 创建 AsyncTask子类的实例对象(即 任务实例)

3. 手动调用execute()从而执行异步线程任务

private class MyTask extends AsyncTask<Params, Progress, Result> {

        ….

      // 方法1:onPreExecute()

      // 作用:执行 线程任务前的操作

      // 注:根据需求复写

      @Override

      protected void onPreExecute() {

           …

        }

      // 方法2:doInBackground()

      // 作用:接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果

      // 注:必须复写,从而自定义线程任务

      @Override

      protected String doInBackground(String… params) {

            …// 自定义的线程任务

            // 可调用publishProgress()显示进度, 之后将执行onProgressUpdate()

             publishProgress(count);

         }

      // 方法3:onProgressUpdate()

      // 作用:在主线程 显示线程任务执行的进度

      // 注:根据需求复写

      @Override

      protected void onProgressUpdate(Integer… progresses) {

            …

        }

      // 方法4:onPostExecute()

      // 作用:接收线程任务执行结果、将执行结果显示到UI组件

      // 注:必须复写,从而自定义UI操作

      @Override

      protected void onPostExecute(String result) {

         …// UI操作

        }

      // 方法5:onCancelled()

      // 作用:将异步任务设置为:取消状态

      @Override

        protected void onCancelled() {

        …

        }

  }

/**

  * 步骤2:创建AsyncTask子类的实例对象(即 任务实例)

  * 注:AsyncTask子类的实例必须在UI线程中创建

  */

  MyTask mTask = new MyTask();

/**

  * 步骤3:手动调用execute(Params… params) 从而执行异步线程任务

  * 注:

  *    a. 必须在UI线程中调用

  *    b. 同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常

  *    c. 执行任务中,系统会自动调用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute() 

  *    d. 不能手动调用上述方法

  */

  mTask.execute();

doInBackground()执行完后会自动调用onPostExecute();

5. 第五章 Fragment基础

【知识点】

  1. 掌握Fragment的状态及常用回调方法

三种状态:(Run Pause Stop—RPS)

  • 运行状态
  • 暂停状态
  • 停止状态

回调方法:(标红为Fragment比Activity多的额外回调)

  • onAttach() 当Fragment与Activity关联时调用
  • onCreate()
  • onCreateView() 创建该Fragment的视图(加载布局)时调用
  • onActivityCreated() 当Activity的onCreate()方法返回时调用
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onDestroyView() 当与该Fragment关联的视图被移除时调用
  • onDestroy()
  • onDetach() 当Fragment与Activity关联被取消时调用

Fragment必须是依存于Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。

  1. 掌握onCreateView()、LayoutInflater中inflate()方法的用法。

我们已经知道了onCreateView() 是在创建该Fragment的视图(加载布局)时调用。

新建一个Left_Fragment类,继承自Fragment

public class Left_Fragment extends Fragment{

    @Override

    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle saveInstanceStFate){

        View view=inflater.inflate(R.layout.left_fragment,container,false);

        return view;

    }

}

LayoutInflater 布局服务

inflater 本身有打气筒的意思

往视图层加载布局就是inflate(打气)

所以其参数中应该有left_fragment.xml布局文件,装载布局文件的容器container,以及是否需要保存实例状态。

6. 第六章 Android数据存储

【知识点】

  1. 掌握文件存储基本操作(参照6.2.2实例)

Android数据存储方式共有5种:

  • SharedPreferences
  • 网络存储
  • 文件存储
  • 外部存储
  • SQLite

Android中文件存储分为:

      • 外部存储 将文件存储到外部设备(SD卡等)
  1. 首先需要检查外围设备是否存在。
  2. 进行读写操作。
  3. 在AndroidManifest.xml种添加读写权限
      • 内部存储 将应用程序数据以文件形式存储在应用程序目录下(data/data<packagename/file/目录下>),该文件属于应用程序私有。

FileOutputStream openFileOutput(String name,int mode);

FileInputStream openFileInput(String name);

name表示文件名

mode表示文件的操作权限:

– MODE_PRIVATE 默认操作权限,只能被当前应用程序读写

– MODE_APPEND 可以添加文件的内容

– MODE_WORLD_READABLE 可以被其他程序读取,安全性低

– MODE_WORLD_WRITEABLE 可以被其他程序写入,安全性低

内部存储方式存储数据(write)

//文件名称

String file_name=”text.txt”;

//写入文件的数据

String str=”Android”;

FileOutputStream file_out;

try{

//保存输入的数据

//openFileOutput()由Context提供

    file_out=openFileOutput(file_name,MODE_PRIVATE);

    file_out.write(str.getBytes());

    file_out.close();

}

catch(Exception e){

    e.printStackTrace();

}

字节流:

-InputStream

-OutputStream

InputStream属于字节流

字节流操作的数据单元是8位的字节 (Byte 1字节)

内部存储方式读取数据(read)

//文件名称

String file_name=”text.txt”;

//保存读取的数据

String str=””;

FileInputStream file_in;

try{

    file_in=openFileInput(file_name);

    //file_in.available() 返回的实际可读字节数

    byte[] buffer=new byte[file_in.available()];

    file_in.read(buffer);

    str=new String(buffer);

}

catch(Exception e){

    e.printStackTrace();

}

字节流:

-InputStream

-OutputStream

InputStream属于字节流

字节流操作的数据单元是8位的字节 (Byte 1字节)

  1. 掌握SQLite数据库基本操作(参照6.5.4实例),主要考察SQLiteOpenHelper、SQLiteDatabase、Cursor的常用方法。

SQLiteOpenHelper

SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据的创建和版本的更新。

实现两个回调方法:

onCreate(SQLiteDatabase db)

onUpgrade(SQLiteDatabase,int oldVersion,int newVersion)

常用方法

getWritableDatabase()

getReadableDatabase()

这两个方法用于获取SQLiteDatabase实例

getReadableDatabase()调用实例:

例如在MainActivity类中调用User_database

……

@Override

protected void onCreate(){

    …..

    User_database user=new User_database(MainActivity.this);

    SQLiteDatabase sqLiteDatabase=user.getReadableDatabase();

}

这里就使用了SQLiteOpenHelper中的getReadableDatabase()来返回SQLiteDatabase实例

SQLite数据库的创建

public class User_database extends SQLiteOpenHelper{

    //构造方法

    public User_database(Context context){

        super(context,”user_db”,null,1);

    }

    //数据库第一次创建时调用该方法

    @Override

    public void onCreate(SQLiteDatabase sqLiteDatabase){

        String sql=”create table user(id integer primary key autoincrement,username varchar(20),paswd varchar(20))”;

        //数据库执行语句

        sqLiteDatabase.execSQL(sql);

    }

    //数据库版本号更新时调用

    @Override

    public void onUpgrade(SQLiteDatabase sqLiteDatabase,int old,int new){

    }

}

SQLiteDatabase类(SQLiteOpenHelper类中的getWritableDatabase()和getReadableDatabase()方法返回该类对象)

使用SQLiteDatabase类可以完成数据库操作 增 删 改 查。

SQLiteDatabase常用方法:

  • long insert(String table,String nullColumnHack,ContentValues values)
  • insert()方法插入的一行记录使用ContentValue存放,ContentValue类似于Map,使用key-value的形式存放
  • update() 修改满足条件的数据
  • delete() 删除满足条件的数据
  • exceSQL() 执行一条占位符号SQL语句
  • close() 关闭数据库
  • Cursor query() 用于查询数据

数据的添加

public void Insert(SQLiteDatabase sqLiteDatabase){

    ContentValues values=new ContentValues();

    values.put(“username”,”蔡徐坤”);

    values.put(“paswd”,”123456″);

    //将数据插入到名为user的表中,数据在容器values

    sqLiteDatabase.insert(“user”,null,values);

     sqLiteDatabase.close();

}

一行记录使用ContentValue存放,ContentValue类似于Map,使用key-value的形式存放

Map是集合类,集合类是容器类。

所以将ContentValues想象成容器 装数据

数据的删除

public void Delete(SQLiteDatabase sqLiteDatabase){

    sqLiteDatabase.delete(“user”,”username=?”,new String[]{“蔡徐坤”});

    sqLiteDatabase.close();

}

delete()参数

第一个参数:表名

第二个参数:需要删除的属性名,?代表占位符号 key

第三个参数:属性名的属性值 value

数据的更新

public void Update(SQLiteDatabase sqLiteDatabase){

    ContentValues values=new ContentValues();

    //以key-value的形式插入

    values.put(“paswad”,”111111″);

    //执行修改的方法(修改 username=蔡徐坤 的密码)

    sqLiteDatabase.update(“user”,values,”username=?”,new String[]{“蔡徐坤”});

}

一行记录使用ContentValues存放,ContentValues类似于Map,使用key-value的形式存放

Map是集合类,集合类是容器类。

所以将ContentValues想象成容器 装数据

Cursor接口

Cursor是一个游标接口,在数据库中作为返回值,相当于结果集ResultSet。

常用方法:

  • moveToFirst() 移动游标到第一行
  • moveToNext() 移动游标到下一行 (常用于查询)

结果集的查询

public List<userInfo> Querydata(SQLiteDatabase sqLiteDatabase){

    Cursor cursor=sqLiteDatabase.query(“user”,null,null,null,null,”id ASC”);

    List<userInfo> list=new ArrayList<userInfo>();

    while(cursor.moveToNext()){

        int id=cursor.getInt(cursor.getColumnIndex(“id”));

        String username=cursor.getString(1); //获取第二列的记录

        String paswd=cursor.getString(2);//获取第三列的记录

        //将每一行的记录到装到list集合中

        list.add(new userInfo(id,username,paswd));

    }

    cursor.close();

    sqLiteDatabase.close();

    return list;

}

List<userInfo> list 用于定义只能是userInfo类的对象才能装入集合

while(cursor.moveToNext())的作用就是遍历table的每一行

cursor.moveToNext()就是移动到下一行

  1. 第七章 ContentProvider的使用

【知识点】

掌握ContentProvider、ContentResolver类的作用,及其类中抽象方法具体的作用。

ContentProvider用于存储和检索数据,是Android中不同应用程序之间共享数据的接口。

ContentProvider以Uri的形式对外提供数据,ContentResolver通过Uri对数据进行操作。

相当于

ContentProvider对数据进行了标识,

ContentResolver则用于解析标识进行操作。

ContentProvider中抽象方法具体的作用:

  • public Boolean onCreate() ContentProvider创建时调用
  • public int delete() 根据传入的Uri删除指定条件下的数据
  • public Uri insert() 根据传入的Uri插入数据
  • public Cursor query() 根据传入的Uri查询指定的数据
  • public int update() 根据传入的Uri更新指定的数据。

点击数:15

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇