适合初学者
只要有activity中有
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
就会生成一个快捷图标,并且是activity的入口。
所以如果想要改写图标的名字 在 activity中加入lable 即可。如果想该图标 只要加上ico 即可
页面间的跳转都是用 Intent
○ 在意图过滤其中 完全匹配才可以跳转 如果有多个action 和多个date只要与其中一个匹配就可以了。
○ 显示跳转 setClass /setClassName
○ 隐示跳转 setAction () action在activity 的清单文件中设置
■ action
■ category 默认为Default
■ data (activity中数据传递)
● scheme 前缀: (例如 打电话 Uri.parse="tel:110")就是前缀包括冒号
● mainType 定义数据类型 如果时图片 img text/password (如果 scheme 和type 都有 在匹配的时候必须使用 setDataAndType())
■ 跳转代码中 要写上 setAction 和setCategory (系统会自动添加默认的Category 如果不是默认的 就要写上。)
■ 只有都匹配才会跳转
■ 数据之间的获取 被跳转的 可以getIntent 调用getDate
在指定类名时如果包名在与应用包名一致 可以写成 .类名 但是在显示跳转的时候必须写全。
startActivity 在显示跳转的时候 会在所有的应用清单文件中去找有没有一个activity的一个action与之匹配
隐士 和显示 的应用场景
○ 显示 在同一个应用中的的跳转
○ 隐式 启动不同应用
activity的生命周期
○ oncreate 创建一般进行一些初始化
○ onstart 被用户可见 但是没有交点 (不能交互)
○ onResume 获得焦点 即 前台应用
○ onPause 失去焦点但是依然可见
○ onstop 不可见 即 后台
○ on destory 销毁 点击返回
○ 注意:在内存不够时会自动杀死 后台程序。
Activity 的启动模式
○ task stack 任务栈
○ 1.singleTop 如果栈顶时该activity 就不会在创建只有不是的才会创建。
○ 2.singleTask 不再栈顶但是之前有调用过 则返回
○ singleInstance : 该activity 启动时会在一个新的任务栈中启动(一个栈中只有它和在一个项目中的非singleinstace activity ) 只要时单例 就会在新的栈中启动。 如果不是单例 不同的应用调用 会创建多个。
○ 如果是有很多地方会调用的activity会用单例。
横竖屏切换 会自动调用生命周期方法 如果想让不掉用 可以在清单文件中activity中 configChange=”orientation|keyboardHidden|screeSize” (横竖屏切换宽高改变不要理会)
○ 写死横屏 screeOrientation="landscape"
○ 写死竖屏 screeOrientation=“protrait”
activity返回时返回数据
■ 前提启动
■ 该活动的时候要使用startActivityForResult(int)
○ 返回方会在销毁之前吧数据返回给调用自己的activity不管你怎么销毁。
○ intent data=new intent();
○ data.putExtra();
○ setResult(0,data);
○ finish() 销毁 当前 相当于点击返回 返回点击也是调用这个方法 可以复写一个返回的方法,来改变。(返回键盘点击触发的方法是 onBackPressed())
■ 接收方 重写 onActivityResult(int ,int intent Data)
四大组件都是要在清单文件中进行配置的。四大组件都是一个类。
广播接收者
○ 创建类 继承 BroadcastRceiver
○ 注册 <receiver></>
○ 接收的类型
■ <intent-filter><action android:name=" .action."/></> 这里的action都定义好了。接收的是别人的广播 接收的action 和广播的action 必须匹配。
○ 在打电话 接收可以获得打出去的电话号码 getResultdate
SharePreferences sp=getSharedPreferences(“ip”,MODE_PRIVE) 将数据保存在本地下次可以直接用。 sp.edit().putString(“ipNumber”,string).commit(); 获取的时候 ip相当于文件名 context.getSharedPreFerences(“ip”,context.MODE_PRIVE).getString(“ipNumber”);
广播的工作过程 打电话 将电话号码广播 接收者拦截修改 再次广播 。(这里的广播接收者肯定有先后顺序 也不是传统的广播 和网页中的过滤器一样 do.chain())
广播是通过intent 实现发送的。所以内容在intent zhong
广播接收者4.0至少要启动一次才会起作用 (点击图标) 手动关闭以后广播接收者不会起作用。、
startActivity 有一个设置 setFlag 是 创建一个任务中来存放 activity 一般用于广播接收者 启动一个项目 因为现在还没有一个任务栈可以放activity (如果不是开机启动是另一个程序发送广播呢启动还要用这个码。)
勒索软件可以通过其他的广播来停止。
软件图标是因为activity中有inter-filter 如果删除就没有图标了。
服务
○ 进程优先级 empty background service visible 前台进程
○ 服务依赖于进程 并且不是独立的进程而是依赖于创建服务的进程。
○ 系统如果将服务杀死 在内存充足的时候会再次重启。
绑定服务的执行流程
○ bindService 一旦执行会调用 onBind 方法 就会返回 IBinder对象(中间对象用于调用服务中的方法的)如果服务还没开起 会先调用 create()方法
startService 和 bindService 都会调用create 之间的区别是:
○ start 开启一个服务进程。bind不是。
○ bind 与当前的 activity的生命周期一致。
○ 所以一般在bind 之前要调用start unbind destory
广播接收者有两种 注册方法
○ 清单文件中 (解除方法为1.删除应用2.手动到设置中停止。)
○ 动态注册 (一般oncreat方法中 比如服务开启时监听广播 或者 应用开启时在Mainactivity 中oncreat)
■ 一些广播接收只能在代码中注册
● 屏幕锁屏和解锁
● 电量改变
服务的分类
○ 本地服务
○ 远程服务
■ (如果调用其他程序服务 没有启动服务怎么办?)//脑残问题 远程调用是通过 绑定得到对象 调用的方法 bind 如果服务不存在会创建。
样式表 (按钮 字体 文本框)
○ style.xml
○ 在values 中更改
<style name="">
<item name="android:layout_width">wrap_content<item>
........
</>
○ 继承
■ <style name="" parent=""> 继承方法<item 加上自己的新样式 相同的样式会覆盖。
■ <style name=" a.b"> b 继承了a 在使用的时候 style="@stle/a.b"
多媒体编程
○ 图片大小的计算
■ bmp 位图 bitmap
■ 图片的大小=图片的总像素*每个像素占用的大小
■ jpg 有损压缩 把相邻的颜色用一个标示 bmp 无损压缩
○ 加载图片
■ Bitmap bm=bitmapFactory.decodeFile();一个路径
■ iv.setImageBitMap(bm)
■ 加载图片时 会把所有的颜色信息存储在内存中 是以 ARGB保存的
■ 图片的缩放 因为手机屏幕就那么大没必要加载很多的像素
● 手机 320*480
● 图片 2400*3200
● 2400/320=7 3200/480=6 缩放大的应为缩放小的有一边是超过的。
● Options opt=new Options(); //解析图片时需要用到的参数都封装在这个对象里的
● opt.inJustDecodeBounds=true // 不会为请求的图片申请内存 去保存像素信息 但是请求了图片的属性信息 从而进行缩放(但是 Bitmap 返回的是null)
○ opt.outWidth opt.outHeight
○ 获取屏幕的宽高
■ Display dp=getWindowManager().geDefaultDisplay();
■ dp.getWidth(); dp.getHeight();
○ opt.inSampleSize
○ opt.inJustDecodeBounds=false 这样就请求图片了。
■ 图片更改
● bitmap 是只读的不能更改。
触摸监听
○ setOntouchListener(new OnTouchListenner(){ onTouch(View v,MotionEvent event)})
○ event.getAction 可以获得动作
■ DOWN 触摸
■ MOVE 滑动
■ UP 离开
■ event.getX() getY ()获得坐标
○ onTouch方法返回 如果是false 触摸事件不处理 true 触摸事件全部手工处理 false的话会传递给 调用触摸事件的父节点 (imageview 在 Linlayout里面 如果想给 Linlayout处理 就设置为false)
○ 图片画 copy.drawLine
○ 设置透明 copy.setFixel(x,y,Color.TRANSPARENT)
sd卡每次启动的时候会遍历一边,把所有多媒体文件都 在数据库中保存索引。(文件按的路径 大小 长度 艺术家)
图库系统中的图库 音乐 视频 是从数据库中 读取的(mide库中的索引)每次打开图库。。显示的是数据库中的数据 而sd卡遍历 只有收到广播 重启手机。
○ Intent intent =new Intent();
○ intent.setAction(Intent.ACTION_MEDIA_MOUNTED)
○ intent.setDate(Uri.fromFile(Enviroment.getExternalStorageDirectory()))
○ sendBroadcast() 发送无序广播
获取sd卡路径
○ Enviroment.getExternal
获取文件的路径
○ 文件默认的路径是 date/date/包名/files/
○ Context.getFileDir 返回的就是默认路径。
消息队列 刷新UI 消息给主线程处理 //static 如果其他地方要用
○ 消息处理器 队列主线程中都有所以只要发送过去就行了
○ Hander hander=new Hander(){//用handler 来发消息
○ public void handleMessage(android.os.Message msg){
○ Bundle b=msg.getDate();
○ bundle.get
○ }
○ }
○ handler.obtainMessage();
○ msg.obj 或者 传递 new Bundle() put
○ handler.sendmessage();
数据库的操作
○ extends SQLiteOpenHelper{
○
○ }
○
类容提供者
○ 为了访问系统数据库(为了吧私有数据暴露给其他数据 其他程序只要访问类容提供者就好了)
○ 系统中的数据必须使用类容提供者。(短信 联系人)
○ 自定义类容提供者
■
帧动画
○ 放在drawable 文件中
○ 配置xml 文件
○ imageView 中显示动画
○ iv.setBackgroundResource(R.drawable.frameimation)
○ (animationdrawable)iv.getBackGround
bat windows 下的批处理文件 。sh 是linux 中的处理文件
JNI
○ 堆栈 数据结构
■ 栈 int i person p; 指针
● 存储 静态内存 static 全局
● 先进先出
● 由操作系统自动分配
■ 堆 malloc / new 空间大
● 动态内存
● 队列 先进先出
● 又程序员 分配释放
○ 交叉编译
■ 源代码 编译 链接 可执行程序
■ 交叉编译就是 模拟其他频台的特性
○ 交叉编译工具链
■ 多个工具的集合
○ 常见工具
■ NDK:开发JNI 模拟其他平台编译代码
■ CDT:C/C++
■ cygwin:linux和 windows
○ 使用C写的方法
■ c源代码放在 JNI 文件中
■ 在本地定义一个方法;public native String func(); 没有方法体。方法体由 C实现。
■ c代码
■ 类型 要参考 NDK 中的 转换类型 String - jstring