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生命周期:

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(安卓)异步加载深入解析
  2. Android(安卓)下拉刷新控件SwipeRefreshLayout结合WebView使用
  3. 关于手机启动的方向,和屏幕的单,双击事件
  4. Android(安卓)Graphics - 3 BufferQueue 和 Gralloc
  5. 浅谈Java中Collections.sort对List排序的两种方法
  6. 箭头函数的基础使用
  7. NPM 和webpack 的基础使用
  8. Python list sort方法的具体使用
  9. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程

随机推荐

  1. android 购物车 listview嵌套问题
  2. android系统移植琐碎知识整理:
  3. 【Android】Looper消息分发(msg.target.d
  4. android中使用arial字体
  5. JSONObject 保存和传送 数组数据 ,如int[]
  6. android,实现圆形循环进度条,不带百分比进
  7. Android(安卓)Appliction 使用解析
  8. Android(安卓)倒影实现算法【搜集】
  9. android gridview 组件 及九宫格的简单编
  10. android GPS HAL 回调函数实现