安卓的入门

资源

字符串资源
在视图中使用资源
@string/test
引用字符串资源 @引用
在代码中使用资源
1、得到Resources
Resources res =getResources();
2、得到资源中的值
String strTest=res.getString(R.string.test);

颜色资源
Android中的颜色是十六进制的RGB值,提供的样式有4种
#RGB #ARGB #RRGGBB #AARRGGBB
使用颜色资源可在res/values目录中的一个XML文件定义

图像资源
Android支持PNG,JPEG和GIF格式的图片。
官方建议不要使用GIF资源。PNG是首选格式。
使用图像就是将图像文件放入res/drawable/,作为资源引用。
在布局文件中,图像作为@drawable.,引用。

控件
单选按钮(RadioGroup & RadioButton)
RadioButton继承自CompoundButton
isChecked() 确定是否 被选中
setChecked()强制选中或取消选中复选框
状态监听器,实现OnCheckedChangeListener接口,并实现回调方法onCheckedChanged()
多选

//内部类
class CheckChangeListener implements CompoundButton.OnCheckedChangeListener{
@Overrid
public void onCheckedChanged(CompoundButton buttonView boolean isChecked){
Log.i(“Test”,“onCheckedChanged”);
}
}

触屏事件
onCreateOptionsMenu
onTouchEcent

控件
DrawerLayout
DrawerLayout是Support Library包中实现了侧滑菜单效果得控件

滚动条ScrollView
ScrollView和HorizontalScroll是为控件或者布局添加滚动条
ScrollView和HorizontalScroll

为什么要使用线程?

当主线程执行的操作时间过长,就无法执行其他操作。消息队列中的消息无法处理,UI界面就不会更新,用户事件也不会处理。
如果主线程执行一个操作5秒,android可能会弹出一个应用程序没有响应的对话框,你的activity会被杀掉。
UI线程中的操作尽量短小,费时的操作(如网络,数据库访问)等要在单独的线程中完成。
常见的耗时操作如下:
网络连接和网络数据的获取
对存储器的读写
大量的数据计算
读取、删除文件建议使用线程,来操作耗时得操作。

Handler的消息传递机制
工作线程可以通过Handler对象和主线程通讯
Hander对象的所有工作将在主线程中执行
Handler类需要实现handleMessage()方法,来处理消息队列中取出的message对象
hanglemessage()方法由主线程调用,可以在需要的时候更新UI界面。但是必须保证此方法快速完成,因为其他UI操作会等待它完成才能执行。
可以在message中附加不同的参数。

Handler的编程接口
void handleMessage(Message message) 通过这个方法接收消息
boolean sendMessage(int what) 发送只有一个what值的消息
boolean sendMessage(Message message)发送消息到Handler,在handleMessage中处理
boolean hasMessage(int what) 判断是否有what值的消息
boolean post(Runnable r) 将一个Runnable添加到消息队列

XML解析
XMLPullParser Pull解析本质是SAX解析
Android项目中XML文件资源位于res/xml目录下
它们在部署时将被编译为有效得二进制形式
根据需要可以自定义XML结构
Android中使用pull方式来解析XML

jSON解析

new JSONobject
getJSONobject

JSON与XML的比较
json和xml在可读性、可扩展性上动不相上下
解码难度上看,json更方便和简洁
json对数据描述性上比xml差
应用json实现功能的速度要远快于xml

消息提示
Toast
构建Toast
静态方法makeText()
需通过构造函数(它将接受一个Context参数)创建一个新Toast实例

context 上下文 text 消息内容 duration 持续时间 值Toast.LENGTH_LONG,LENGTH_SHORT.固定值
Toast.makeText(this,“这是一个测试提示消息”,Toast.LENGTH_LONG).show();

构造来构建Toast
Toast toast=new Toast(this);
ImageView image=new ImageView(this);
image.setImageResource(R,drawable.ic_launcher);
toast.setView(image);
toast.setDuration(1000);
toast.show();

//显示出图标的Toast
View toastView=LayoutInflater.from(this).inflate(R,layout.toast_view,null);
toast=new Toast(this);
toast.setView(toastView);
toast.setDuration(Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER_HORLZONTAL,0,0);
toast.show()

AlertDialog
提醒框 经典的对话框1样式–AlertDialog
模态对话框
AlertDialog将弹出并获取焦点,一直显示,直到被用户关闭
用于提醒关键信息

AlertDialog dlg=new AlertDialog.Builder(this);
.setIcon(R,drawable.ic_launcher)
.setTitle(“Test”)
.setPoitiveButton(“确定”,null)
.setMessage(“这是一个测试对话框”)
.create()
dlg.show();

列表对话框

多选对话框

自定义进度对话框

ProgressDialog
让用户了解进度的最典型方式
用户显示一个进度条,或者一个动态浏览图示

自定义弹出对话框

适配器Adapter
适配器可以为多个不相关的API提供一个公共的接口。

Android的适配器负责为选择部件提供数据源,也负责将单独的数据元素转换为显示在选择部件中的特定视图。

列表 ListView
Android中经典的列表框部件叫做ListView
ListView调用setAdapter以提供数据和子视图
然后通过添加一个侦听器,以便在选项变化时做出反应
setOnitemClickListener()

arrayAdapter

SimpleAdapter
理解simpleAdapter构造
多个文字

Listview提高效率
使用convertView
使用持有者模式

baseAdapter

@Override
public int getCount() {
    return phoneListModel.size();
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
//解析布局文件成为view
//解析xml 解析dom
LayoutInflater inflater= LayoutInflater.from(Content);

}

//持有者
ViewHolder

继承BaseAdapter实现适配器

GridView与Spinner

numColumns 每列显示多少个

spinner类似下拉选择

Activity
Activity配置
Activity间的通讯

启动activity
startActivity

Intent intent =new Intent();
//设置一个逻辑动作名
intent.setAction(“asda”)
//添加类别
intent.addCategory(“asdas”)
//传递值到另一个组件
intent.putExtra(“hello”,“你好”);
startActivity(intent);

Activity的传值方式
通过Intent中的putExtra方法将传值到另一个组件
intent.putExtras(Bundle)
intent.putExtra(key,value)
另一个组件通过方法getIntent()得到Intent,通过getExtras方法得到所传的对象

Activity的启动模式
Activity启动模式设置:

Activity的standard启动模式
standard是系统默认的启动模式
标准启动模式,每次激活Activity时都会创建Activity,并放入任务栈中

Activity的singleTop启动模式
如果在任务的栈顶正好存在该Activity的实例,就重用该实例,而不会创建新的Activity对象,不过它会调用onNewIntent()方法
如果栈顶部不存在就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)会回调onNewIntent()方法

Activity的singleTask启动模式
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())
重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈
如果栈中不存在该实例,将会创建新的实例放入栈中。

Activity的singleInstance启动模式
与singleTask模式的区别是存放singleInstance模式窗口对象的回退栈不能有其他任何窗口对象。
因此如果该窗口不存在,则要新建任务来存放该singleInstane模式窗口

灵活使用4种模式可以节约系统资源

Fragment的概念

Fragement不可以有带参构造

Fragment是在Android3.0(api11)开始引入新的API技术
为了提高代码重用性和改善用户体验,我们将Activity中的UI组件进行分组和模块化管理,这些分组后的UI组件就是Fragment。
一个Activity页面中可以包含多个Fragment模块,而同一个Fragment模块也可以被多个Activity使用。
每个Fragment有自己的布局,有自己的生命周期

Fragment必须放在一个Activity中
Fragments有它自己的生命周期,而且受到它所在的宿主Activity的生命周期的影像
Fragments可以接收它自己的事件
一个Fragment可以放在多个Activity中,一个Activity中也可以放置多个Fragments

Fragement生命周期
创建一个Fragment要实现的回调函数
onCreate()
创建Fragment的时候系统会调用此函数
onPause()
当用户离开当前Fragment时调用这个方法 通常用来保存持久化数据
onCreateView()
当Fragment第一次绘制它的ui的时候调用。
这个方法必须返回一个view
表示这个Fragment的根布局

当宿主Activity处于运行状态可以自由的添加和删除Fragment,只有当Activity处于运行状态的时候,Fragment的生命周期才能独立变化
否则,直接受宿主Activity生命周期的影响。

FragmentManager API
FragmentTranscation API
系统提供的Fragment

FragmentManager 用来管理Activity中的Fragment
findFragmentById()通过id查找Activity中的Fragment
findFragementByTag()通过字符串查找Activity中的Fragment
poopBackStack() 模拟用户的点击Back键的操作
addOnBackStackChangedListener()添加后台栈改变监听器

FragmentTransaction API
add() 向容器添加一个Fragment
remove() 删除一个Fragment
replace() 将容器中的Fragment替换成新的Fragment
hide()隐藏已存在的Fragment
show()显示此前隐藏的Fragment
addToBackStack() 将事务添加到后台栈
commit() 提交事务,将改变应用到Activity

动态管理步骤
动态添加
1、获得FragmentManager
FragmentManager fm=getFramentManager();
2、通过FragmentManager得到FragmentTrasaction对象
FragmentTransaction ft=fm.beginTransaction();
3、将Fragment添加到容器中
My Fragment fragment=new MyFragment();
第一个参数,容器id,第二个参数Fragment对象,第三个参数Fragment的tag
ft.add(R.id.layout,fragment,“test”);
4、提交
ft.commit()

动态删除
1、获得FragmentManager
FragmentManager fm=getFramentManager();
2、通过FragmentManager得到FragmentTrasaction对象
FragmentTransaction ft=fm.beginTransaction();
3、移除
My Fragment fragment=new MyFragment();
ft.remove(fragment)
4、提交
ft.commit()

控制显示隐藏
1、获得FragmentManager
FragmentManager fm=getFramentManager();
2、通过FragmentManager得到FragmentTrasaction对象
FragmentTransaction ft=fm.beginTransaction();
MyFragment fragemnt=(MyFragment)fm.findFragmentByTag(“test”);
//隐藏或显示
if(fragemnt.isHidden()){
ft.show(fragment);
}else{
ft.hide(fragment);
}
4、提交
ft.commit()

系统提供的Fragment
系统提供了几个其他的Fragment类开发者可以继承
DialogFragment 显示一个悬浮对话框
listFragment 显示一个由adapter管理的项目列表

支持平板和手机
运行Android系统的设备屏幕大小各不相同,系统会调整程序的UI的大小去适应每种屏幕。开发者需要做的就是将UI设计得更加灵活,为不同的屏幕提供不同的资源文件来对不同的屏幕进行优化。

平板电脑的屏幕比手机大得多,每次可以显示更多的内容,而手机只能分多次来显示。因此,即使可以调整手机程序大小去适配平板电脑吗,这样并没有充分利用平板电脑的特点去增强用户体验。

为了实现这一模型,很重要的一点就是把Fragment分成各自独立的部分。需要遵循两条原则:
避免在一个Fragment中操纵另一个Fragment
将Fragment相关的代码全都放在Fragment中,而不是放在Activity中。

自定义控件
View是android ui控件的基类
在view上所展现的内容全部都是绘制出来的
绘制的代码是写在onDraw()方法中的
自定义的View在界面上显示,只需要像使用普通的控件一样来使用自定义View就可以了

public class myView extends View {
private Paint mPaint; //画笔
private Bitmap mBitmap;

public myView(Context context, AttributeSet attributes,int defstyleAttr){
    super(context,  attributes,defstyleAttr);
    init();
}
/*
当以XML布局文件的方式使用时,自动调用
 */
public myView(Context context, AttributeSet attributes){
    super(context,  attributes);
    init();
}
/*
以代码的方式动态添加View到容器时使用
 */
public myView(Context context) {
    super(context);
    init();
}

private void init(){

    mPaint=new Paint();
    mPaint.setColor(Color.BLUE);//画笔颜色
    mPaint.setStyle(Paint.Style.STROKE); //画笔样式
    mPaint.setStrokeWidth(3);//画笔宽度
    Resources resources=getResources();
    //图片要用安卓格式的不然读取不到 一直为null
    mBitmap = BitmapFactory.decodeResource(resources, R.drawable._6330);
}

/*
当View需要呈现出来时自动调用
    canvas 画布
 */
@Override
protected void onDraw(Canvas canvas){
    super.onDraw(canvas);
    /*
    绘制圆形
     */
    canvas.drawCircle(10,20,10,mPaint);
    /*
    绘制矩形
        canvas.drawBitmap();
     */

// Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.back);
canvas.drawBitmap(mBitmap,0,0,null);
/*
绘制图片
canvas.drawBitmap();
*/
}
}

组合控件
并不需要自己去绘制视图上显示的内容,而只是用系统原生的控件
可以将几个系统原生的控件组合到一起,这样创建出的控件就被称为组合控件

继承控件
并不需要自己重头去实现一个控件,只需要去继承一个现有的控件,然后在这个控件上增加一些新的功能
就可以形成一个自定义的控件
继承控件的特点就是不仅能够按照我们的需求加入相应的功能,还可以保留原生控件的所有功能。

Service的概念
Service是一种Android的组件,可以在后台长时间运行
Service不提供界面交互
即便用户跳转至另一个应用后,Service仍旧在后台运行
任意应用组件都可以绑定服务,甚至可以用来完成进程间通讯的任务
需要下载时
播放音乐
文件I/O

Service可以通过两种方式来调用
start
一旦某个组件start一个Service后,service开始独立运行,不在与原来的组件产生任何关系
startService
Service 生命周期
只有生命周期的第一次才调用
onCreate
每次startService启动会调用
onStartCommand

bind
某个组件bind一个Service后,Service为组件提供一个接口,近似于客户端,会进行互相的交互。

onCreate

onBind

系统服务
由于是Android原生代码,可以通过Android代码来对服务进行交互
Android将Binder封装成普通的Manager类,代码调用时无法察觉是使用了service
这些服务通过Context.getSystemService(String name)来获得name决定了获得不同的Manager类,不同的Manager类各自的方法来调用系统功能或是访问系统状态

POWER_SERVICE(“power”) PowerManager电源管理
NOTIFICATION_SERVICE(“notification”) NotificationManager通知的管理
LOCATION_SERVICE(“LOACTION”) LocationManager定位的控制
CONNECTIVITY_SERVICE(“connection”) ConnectivityManager 网络连接的管理

声音服务调用方式
AudioManager mAudioManager
mAudioManager=(AudioManager ) getSystemService(Context.AUDIO_SERVICE);

//streamType 类型 手机 闹铃 音乐。。。。
mAudioManager.adjustStreamVolume(AudioManager.STREAM_VOICE_CALL,??,flags)

Notification
当系统想要不妨碍操作的情况选通知用户,可以使用Notification展示在屏幕最上方的通知栏内
如果想要看详细的信息,拉 下通知栏可以看到
系统提供了对于Notification的服务
getSystemService(NOTIFICATION_SERVICE)为我们返回一个通知服务的接口。

文件系统
Android使用的是基于Linux的文件系统,开发人员可以建立和访问程序自身的私有文件,
也可以访问保存在资源目录中得原始文件
和XML文件,还可以在SD卡等外部存储设备中保存文件

Android允许应用程序创建仅能够自身访问得到私有文件,文件保存在设备的内部存储器上,
在Linux系统上的/data/data//中

使用文件系统
文件操作
常用FileInputStrram,FileOutputStrream类结合openFileOutput,openFileInput方法完成对文件的读写

使用文件资源
原始资源文件位于res/raw目录下,程序部署时会将其完整地打包进apk,在程序中可通过资源ID访问

对sd卡进行读写需要有权限
访问sd卡
Environment.getExternalStorageState()
Environment.MEDIA_MOUNTED则说明存在即可读写
获取SD卡目录
Environment.getExternalStorageDirectory()

数据库创建与更新
SQLiteDatabase类
SQLiteDatabase等同于JDBC中Connection和Statement的结合体
SQLiteDatabase即代表与数据库的连接,又只能用于执行sql语句操作
操作SQLite数据库的步骤
创建SQLiteDatabase对象,它代表与数据库的连接
创建数据库中的表(执行CREATE)
调用SQLiteDatabase对象执行数据库操作(执行DML)
对查询的结果集Cursor进行处理。

使用SQLiteOpenHelper
推荐从SQLiteOpenHelper继承,并重新实现onCreate方法
在onCreate方法中运行SQL语句创建表格
从SQKieteOpenHelper的接口getReadableDatabase()或
getWritableDatabase()进行操作数据库

Android提供得到一个管理数据库的工具类,可用于管理数据库的创建于版本更新
常用方法:
getReadableDataBase() /getWritableDataBase()
onCreate
onUpgrade
close

package com.mosh.myapplication.utils;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

public class myOpenHelper extends SQLiteOpenHelper {
private static final String CREATE_TABLE_TEST=“create table Test(_id integer primary key autoincrement,name)”;
public myOpenHelper(@Nullable Context context, @Nullable String name) {
super(context, name, null, 1);
}

/*
二、数据库文件名
三、如果为null使用默认方式
四、版本
 */
public myOpenHelper(@Nullable Context context, @Nullable String name, int version) {
    super(context, name, null, version);
}
/*
当数据库文件不存在,创建数据库文件,并且第一次使用
只调用一次
 */
@Override
public void onCreate(SQLiteDatabase db) {
    //创建表只需执行一次
    db.execSQL(CREATE_TABLE_TEST );
}

/*
版本更新
 */
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //当版本更新,需要更新数据库对象(创建表)
    //db.execSQL(CREATE_TABLE_TEST );

}

}

private void test(){
    myOpenHelper myOpenHelper=new myOpenHelper(this,"test.db");
    SQLiteDatabase db=myOpenHelper.getWritableDatabase();//返回数据库可读写
    //SQLiteDatabase db1=myOpenHelper.getReadableDatabase();//返回数据库,如果没有问题与getWritableDatabase完全相同,如果磁盘空间不足,则返回的数据库为只读
    String sql="insert into test(name) values('aaa ')";
    db.execSQL(sql);//执行sql语句
    db.close();//数据库关闭
    myOpenHelper.close();//数据库连接关闭
}

数据库中的插入于查询操作

SQLiteDataBase中的方法
insert(…)
query(…)

第一个参数 表名 第二个参数希望插入NULL做列得到列明 第三个参数ContentValues 对象 -Map
插入 long insert(String table,String nullColumnHack,ContentValues values)

查询
Cursor query(
String table,
String[] columns,String selection,
String[] selectionArgs,
String groupBy,
String having,
String OrderBy,
String limit
)

你可能感兴趣的:(android)