Android平台架构:

安卓平台架构
Applications (应用程序) -
Applications Framework (应用程序框架) -
Android Runtime(android 运行时) Libraries (库)
Linux Kernel (linux内核) -
  1. 应用程序提供一组应用程序。java编写。我们再此开发

  2. 开发的程序都是基于Applications Framework,简化代码编写/提高程序复用性

  3. Libraries提供一组C/C++的库,开发人用可通过Applications Framework使用

  4. Android 运行时包括核心库和Dalvik虚拟机,核心库包含java核心库大部分功能,虚拟机负责运行程序

  5. Android采用Linux 2.6 内核提供的核心服务,包括安全性,内存管理,进程管理

Android四大组件:

Activity、Service、Broadcast Receiver、Content Provider

Android项目结构:

src包:应用程序的源代码

gen包:包含由ADT生成的java文件(R.java AIDL文件创建的接口)【R.java也在这】

android.jar: 包含了Android项目所需要使用的工具类

assets包:用于保存原始资源文件,其中的文件会编译到.apk,并且原文件名会被保存(通常用于保存文本,游戏数据)

res包:保存资源文件,当该包中文件发生变化,R文件会自动修改

drawable:用来保存图片(有几个是因为保存高,中,低)

layout:保存应用布局文件

values:保存应用中使用的字符串

AnodroidManifest.xml 文件:每个程序必须有一个,位于根目录,表明Activity,Service信息等配置信息

project.properties文件:包含项目属性

adb命令:

adb devices //查询模拟器adb -s em-001 install test.apk //在em-001上安装test.apkadb install d:\test.apk  //安装d盘的test.apkadb push   //将本地文件复制到设备adb pull   //将设备文件复制到本地

android 可以有多个Activity,他们组成栈,当前活动位于栈顶,之前的活动被压入栈底,成为非活动Activity

Activity生命周期:

Android 复习资料_第1张图片 Activity生命周期

onCreate(): 创建activity时被调用

onStart(): 启动activity时被调用,Activity变为显示时候被调用

onRestart(): 重新启动activity时候被调用,该方法总是在onStart()之后被调用

onPause:暂停Activity时被调用,通常涉及持久化保存数据

onResume:当Activity从暂停变为活动时候被调用

onStop: 停止Activity调用

onDestory:摧毁Activity调用

Activity中经常重写onCreate()和onPause()2个方法

创建一个Activity类

import android.app.Activitypublic MainActiviy extends Activity{}//我们同时也要重写onCreate方法@Overridepublic void onCreate(Bundle savedlnstanceState){  surper.onCreate(savedlnstanceState);  setContentView(R.layout.main);//设置要显示的视图}

配置Activity

创建完成后,还要在AndroidManifest.xml中进行配置

    

启动/关闭Activity

//启动Intent intent = new Intent(MainActivity.this,DeatilActivity.class);startActvity(intent)  //启动活动//关闭finsh() //在Activity中执行 关闭

Activity中的传参问题

使用Bundel在Activity之间交换数据:
先将数据存入Bundel,再将Bundel存入Intent,Intent再在不同的Activity间传递。

//Bundle 存值Intent intent = new Intent(MainActivity.this,DeatilActivity.class);  Bundle bundle = new Bundle();bundle.putCharSequence("name","HOUN");bundle.putCharSequence("pwd","123456");  intent.putExtras(bundle);startActivity(intent);
//Bundle 取值Intent intent = getIntent();Bundle bundle= intent.getExtras();String name = bundle.getString("name");String pwd = bundle.getString("pwd");
//关闭某个Activity后返回//打开Activity代码 替换为 startActivityForResult(intent,CODE)//在要返回的Activity中的finish()前加  setResult(0x717,intent)//然后在第一个Activity里重写onActivityResult方法@Overrideprotected void onActivityResult(int requestCode,int resultCode,Intent data){  super.onActivityResult(requestCode,resultCode);  if(requestCode==0x717 && resultCode==0x717){    Bundle bundle=data.getExtras();    /**继续你的操作*/  }}

布局管理器

  1. 线性布局

     

    组件按水平或垂直方向;

    android:orientation=(horizontal(水平)/ vertical(垂直,默认))

    android:gravity (布局管理器内组件的对齐方式)

  2. 表格布局

         

    占一行,继承线性布局

  3. 帧布局

```   ``` 默认从左上脚(0,0)处开始,层叠排序,后面会覆盖前面的
  1. 相对布局
  

线性布局

Intent

Intent(意图)主要是解决Android应用的各项组件之间的通讯

实际上Activity Service Broadcast Receiver 这3个核心组件都需要Intent来激活

Intent包含

1. 组件名称2. 动作 setAction() //设置 getAction()//读取3. 数据4. 种类5. 额外:putExtras() 和 getExtras() 作为Bundle的设置和读取6. 标记

Intent的两种用法:

(1). 显式的Intent,即在构造Intent对象时就指定接收者.

eg:

Intent it = new Intent(Activity.Main.this, Activity2.class);startActivity(it);  

上面那个intent中, 直接指明了接收者:Activity2

(2).隐式的Intent,即Intent的发送者在构造Intent对象时,并不知道也不关心接收者是谁,有利于降低发送者和接收者之间的耦合,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间.
eg:

Intent it = new Intent();it.setAction("com.google.test");startActivity(it);

上面那个intent, 没有指明接收者, 只是给了一个action作为接收者的过滤条件。
对于显式Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些隐式Intent,通过解析,将Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。

           //android.intent.action.MAIN决定一个应用程序最先启动那个组件//android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里(说白了就是是否在桌面上显示一个图标)

注意: 每一个通过 startActivity() 方法发出的隐式 Intent 都至少有一个 category,就是 "android.intent.category.DEFAULT",所以只要是想接收一个隐式 Intent 的 Activity 都应该包括 "android.intent.category.DEFAULT" category,不然将导致 Intent 匹配失败.

Intent的过滤器(intent-filter),按照以下优先关系查找:action->data->category

AndroidManifest.xml

AndroidManifest.xml文件详解

声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)

<?xml version="1.0" encoding="utf-8"?>                                                                                                                                                                                                                                                                           . . .                                                                      . . .                                                                      . . .                                                                                                                                         
 //来指定权限开发eg: //开放网络 //开放照相机 //权限声明标签 //用于指定Android应用可使用的用户库 //应用配置的根元素,位于下层,包含所有与应用有关配置的元素 //Activity活动组件(即界面控制器组件)的声明标签,Android应用中的每一个Activity都必须在AndroidManifest.xml配置文件中声明.标签中常用的属性有:Activity对应类名android:name,对应主题android:theme,加载模式android:launchMode,另外,标签还可以包含用于消息过滤的元素 //用于Intent消息过滤器的声明 //Service服务组件的声明标签 //Boardcast Receiver广播接收器组件的声明标签,用于定义与描述一个具体的Android广播接收器 //Content Provider内容提供者的声明标签

Content Provider

Content Provider 用于保存和获取数据(对所有应用可见)

一般使用ContentResolver对Content Provider进行操作

ContentResolver cr = getContentResolver();

content:// 模式表示数据由Content Provider来管理

URI
content:// com.test.emprovider /abc /001
A B C D
标准的前缀 authority部分(要声明),用于识别Content Provider Content Provider路径部分 ID值

使用预定义的Content Provider

ContentResolver rs = getContentResolver();Cursor cursor = rs.query();

使用自定义的Content Provider
首先重写6个方法

public boolean onCreate()public Cursor query()public Uri insert()public int update()public int delete()public String getType()
//声明:

音频/视频

//构造函数MediaPlayer player = MediaPlayer.create(this,R.raw.d);MediaPlayer player = MediaPlayer.create(this,Uri.parse("http://www.asd.comd/a.mp3"));//注意访问网络资源的时候 在manifest.xml中增加权限//无构造函数MediaPlayer player = new Mediaplayer();player.setDataSource("/sdcard/s.wav"); //指定要装载的音频文件player.prepare(); //预加载音频/**--------------------------------*/player.start(); //开始播放player.stop(); //停止播放player.pause(); //暂停/**--------------------------------*///编写play方法private voidplay(){    try{        player.reset(); //重置MediaPlayer对象        player.setDataSource("xxxxx");        player.prepare();        player.start();    }catch(Exception e){    }}

SoundPool 也可以来播放音频

VideoView 播放视频

一般VideoView和MediaController 共同使用

MediaController mc=new MediaController(MainActivity.this);video.setVideoPath("xxxx");video.setMediaController(mc);video.requestFocus();vidoe.start();vidoe.pause();vidoe.stop();

MediaPlayer和SurfaceView播放视频

//播放private Mediaplayer mp;  //声明MediaPlayerprivate SurfaceView sv;  //声明SurfaceViewmp=new Mediaplayer();sv=(SurfaceView)findViewById(R.id.surfaceView1)mp.reset();mp.setDataSource("xxxx");mp.setDisplay(sv.getHolder());mp.preare();mp.start();mp.stop();mp.pause();

绘图

Paint (画笔)

Paint paint=new Paint(); //无参构造setColor(int color) color参数可以用Color类提供的常量,也可以用Color.rgb(r,g,b) //0~255setStrokeWidth(float width) //设置笔的粗细setStyle(Panit.Cap cap) //设置空心还是实心参数见下://Paint.Style.FILL:填充内部//Paint.Style.FILL_AND_STROKE  :填充内部和描边//Paint.Style.STROKE  :描边

Canvas (画布)

Android中要绘图,首先要创建一个继承子View类的视图,然后在该类中重写onDraw(Canvas canvas)方法

protected void onDraw(Canvas canvas){    super.onDraw(canvas);    Paint paint=new Paint();    paint.setColor(Color.RED);    canvas.drawRect(40,40,200,100,paint)}
//canvas 提供的绘制几何图形canvas.drawCircle(cx,cy,radius,paint); //圆形canvas.drawLine(startX,startY,stopX,stopY,paint); //线canvas.drawPoint(x,y,paint); //点canvas.drawRect(left,top,right,bottom,paint); //矩形 这里的left是指左边离屏幕边界的距离

常见UI控件

  1. 文本框:

    TextView textView = (TextView) findViewById(R.id.textview1); textView.setBackgroundResource(R.drawable.bg); //设置背景图片textView.setBackgroundColor(Color.RED); //设置背景颜色
  2. 编辑框
    EditText类是TextView类的子类

    getText()方法可获得编辑框的值

  3. 按钮

    // 1. onCreate()方法中增加监听Button b = (Button)findViewById(R.id.button1);b.setOnClickLinstener(new OnClickListen(){    @Override    public void onClick(View v){        //code here    }})// 2. xml中绑定public void myClick(View v){    //code here}//然后在布局文件中 通过android:onClick="myClick"
  4. 单选/复选框

    //单选框(一般和RadioGroup一同使用)            //isChecked() 用于判断是否被选中//复选框
  5. 图像视图

    //matrix方式缩放,fitXY横纵缩放,fitStart缩放左上角,fitCenter到中央,fitEnd 到右下角 // center 中央不缩放,centerCrop缩放图片完全覆盖imageview,centerInside缩放imageview能完全显示
  6. 列表视图

      //1. 在res\values 目录创建 arrays.xml        1    2    3            //2. 使用关联适配器 在onCreate()final ListView lv=(ListView)findViewById(R.id.listView1);lv.addHeaderView(line()); //设置header viewArrayAdapter adapter =ArrayAdapter.createFromResource(          this,R.array.ctype,android.R.layout.simple_list_item_check)lv.setAdapter(adapter);lv.addFooterView(line()); 

    ...后续继续更新适配器

  7. 拖动条

        seekbar=(SeekBar)findViewById(R.id.sb1);seekbar.setOnSeekBarChangeListener(new OnSeekChangeListener(){    @Override    public void onStopTrackingTouch(SeekBar sb){        //stop seek    }    @Override    public void onStartTrackingTouch(SeekBar sb){        //start seek    }    @Override    public void onProgressChanged(SeekBar sb,int progress,boolean fromUser){        //change seek    }})

物理按键

 KEYCODE_POWER  //电源键 KEYCODE_BACK //后退键 KEYCODE_MENU //菜单 KEYCODE_HOME  //home键 KEYCODE_SEARCH  //查找 KEYCODE_CAMREA //相机 KEYCODE_DPAD_CENTER/UP/DOWN/RIGHT/CENTER //方向键 KEYCODE_POWER_VOLMUE_UP|DOWN  //音量大小 KEYCODE_POWER_0~9/A~Z   //0~9 A~Z

重写一下回调方法

onKeyUp()onKeyDown()onKeyLongPress()

相关监听事件

onClickListener()  短时间点击onLongClickListener() 长时间点击

关于触摸:

//实现接口  implements OnTouchListener(){}//重写 onTouch(){}

实验

1. 小球跟随 核心代码

public class MainActivity extends AppCompatActivity {    private float x=100;    private float y=100;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        RelativeLayout rl=(RelativeLayout)findViewById(R.id.activity_main);        rl.addView(new myView(this));    }    public class myView extends View{        public myView(Context context){            super(context);        }//构造函数        @Override        protected void onDraw(Canvas canvas){            Paint paint=new Paint();            paint.setColor(Color.RED);            canvas.drawCircle(x,y,50,paint);        }        @Override        public boolean onTouchEvent(MotionEvent event){             switch (event.getAction()){                case MotionEvent.ACTION_UP:                case MotionEvent.ACTION_DOWN:                case MotionEvent.ACTION_MOVE:                    x=event.getX();                    y=event.getY();                    invalidate();                    return true;            }            return super.onTouchEvent(event);        }    }}

2. 微信登陆(Activity传值版)

2.1 布局xml (老师的,但是布局中no与name的顺序反了) xml 大概看一哈了解一哈就行了

                

2.2 MainActivity (登陆 Activity相互传递)

public class MainActivity extends AppCompatActivity {    EditText _name;    EditText _no;    private int CODE=0X111; //自己定义的状态码 Activity回传的时候使用    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        _name=(EditText)findViewById(R.id.editText_name);        _no=(EditText)findViewById(R.id.EditText_no);        findViewById(R.id.button_logon).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                String name=_name.getText().toString();                String no=_no.getText().toString();                Intent intent=new Intent(MainActivity.this,Main2Activity.class);                //传值有2种 bundel 或者直接intent ,我这里使用的是bundle 备注的部分则是intent                //intent.putExtra("name",name);                //intent.putExtra("no",no);                Bundle bundle=new Bundle();                bundle.putCharSequence("name",name);                bundle.putCharSequence("no",no);                intent.putExtras(bundle);                startActivityForResult(intent,CODE);            }        });    }// 自己加的 Activity回传参数执行函数的代码部分    @Override    protected void onActivityResult(int requestCode,int resultCode,Intent data){        super.onActivityResult(requestCode,resultCode,data);        if(requestCode==CODE && resultCode==CODE){            Bundle b2=data.getExtras();            Log.d("name",b2.getString("test"));          }    }}

2.3 Main2Activity (Activity相关回传参数的代码 )

public class Main2Activity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main2);        TextView t1=(TextView)findViewById(R.id.v1);        TextView t2=(TextView)findViewById(R.id.v2);        final Intent intent=getIntent();        final Bundle bundle=intent.getExtras();        t1.setText(bundle.getString("name").toString());        t2.setText(bundle.getString("no").toString());  // 如果使用的是intent直接传值,则用下面方法获取  //      t1.setText(intent.getStringExtra("name"));   //     t2.setText(intent.getStringExtra("no"));        findViewById(R.id.back).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent t1=new Intent();                Bundle b2=new Bundle();                b2.putCharSequence("test","123131231");                t1.putExtras(b2);                setResult(0X111,t1);                finish();            }        });    }}

3. 微信登陆(HTTP版)

3.1 MainActivity (登陆HTTP,老师作业的更改版(只有部分核心代码))

public class MainActivity extends Activity {    EditText _name;    EditText _no;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        _name = (EditText) findViewById(R.id.editText_name);        _no = (EditText) findViewById(R.id.EditText_no);        findViewById(R.id.button_logon).setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                                String nameString = _name.getText().toString();                String noString = _no.getText().toString();                String content = "username=" + nameString + "&no=" + noString;                MyNetClient mn = new MyNetClient();                try {                    String result = "";                    result = mn.HttpPost("http://47.93.13.69/login/login.php", content);                    if (!result.equals("")) {  //这里是判断是我自己随便加的,获取到result具体如何判断应该根据实际条件来                        Intent intent = new Intent(MainActivity.this, Act1.class);                        startActivity(intent);                    }                } catch (IOException e) {                    e.printStackTrace();                }            }        });    }}

3.2 上文用到的老师写MyNetClient 的HttpPost方法

    //普通post提交    //url   提交的页面    //content  提交的数据,格式:name1=value1&name2=value2...    public static String HttpPost(String url, String content) throws IOException {            HttpURLConnection conn = null;              // 创建一个URL对象            URL mURL = new URL(url);            // 调用URL的openConnection()方法,获取HttpURLConnection对象            conn = (HttpURLConnection) mURL.openConnection();            conn.setRequestMethod("POST");// 设置请求方法为post            conn.setDoOutput(true);// 设置此方法,允许向服务器输出内容            conn.setDoInput(true);            conn.setUseCaches(false);                        conn.connect(); //打开连接                        // post请求的参数            String data = content;            // 获得一个输出流,向服务器写数据,默认情况下,系统不允许向服务器输出内容            OutputStream out = conn.getOutputStream();// 获得一个输出流,向服务器写数据                        out.write(data.getBytes());            out.flush();            out.close();            String responseCookie = conn.getHeaderField("Set-Cookie");            if (responseCookie != null) {                Log.i("demo", responseCookie);            }            int responseCode = conn.getResponseCode();// 调用此方法就不必再使用conn.connect()方法            if (responseCode == 200) {                InputStream is = conn.getInputStream();                InputStreamReader isr = new InputStreamReader(is, "utf-8");                BufferedReader br = new BufferedReader(isr);                String result = br.readLine();                return result;            }                 return null;    }

临时抱佛脚的复习资料,可能存在一些问题。如有问题,请在评论区指出,谢谢。

更多相关文章

  1. Android布局LinearLayout+RelativeLayout知识点概括
  2. Android 四大组件之 Activity(1)--生命周期
  3. Android处理Bitmap的一些方法
  4. Android setMovementMethod() 方法
  5. Android切换主线程更新UI方法总结
  6. android Log.isLoggable方法的使用

随机推荐

  1. 常见的监控软件及特点
  2. Linux运维小细节之回收站(二)
  3. Linux运维小细节之回收站(一)
  4. A小学校课程表和登录表单
  5. 表单设计学习
  6. 3.18作业
  7. 如何使用 Markdown and Emmet
  8. 项目练习总结
  9. 从阿里云故障说 Io hang 是什么?
  10. JavaMySQL面试题,如何书写 update 避免表