应用程序基础之02-应用程序组件篇(二)
Android系统设计的一个独一无二的方面是任何一个应用都可以启动其他应用中的组件。例如,如果你想让用户使用设备的相机拍摄一张图片,可能有其他应用已经完成了此项功能,那么你的应用就可以直接使用此功能,而不用自己再次开发一个activity去拍摄图片。你的应用中不需要包含甚至不需要连接相机应用中的代码。反而,你可以简单地启动相机应用的一个activity组件来拍摄图片。拍摄完成之后,图片甚至可以返回给你的应用,因此你可以使用它。对于用户来说,看起来相机好像是你的应用的一部分。
当系统启动一个组件时,它实际上为该应用(如果该应用并非在运行中)启动了一个进程,并且实例化组件需要的所有类。例如,如果你的应用启动相机应用的一个activity来拍摄照片,该activity是运行在相机应用的进程中而并非你的应用进程。因此,不像大多数其他系统的应用一样,Android系统应用程序没有单独的入口点(例如没有main()函数)。
因为系统在单独的进程中运行每一个应用程序,而这些进程带有文件权限,严格限制了对其他应用程序的访问,因此你的应用不能直接激活其他应用程序中的组件。但是Android系统当然是可以激活应用程序中的组件的,所以你必须向系统发送一条消息指定你的intent来启动特定的组件。这样系统便可以为你激活所需的组件了。
激活组件(Activiting Components)
四种组件类型中的三个——activitys、services和broadcastreceivers,都是被一个叫做intent的异步消息激活的。在运行时,intents将单个的组件与其他组件绑定,不管组件是属于你的应用还是属于其他的应用(你可以把intents想象成信使,用于请求其他组件的动作)。
一个intent作为一个Intent类的对象被创建,intent定义消息来激活某个特定的组件或者一类特定的组件。一个intent可以是显式的也可以是隐式的。
对于activity和service,一个intent定义了一个要执行的动作(例如,让“view”或者“send”些什么),也可能指定了要操作的URI类型的数据(其中有一些在其他组件启动的时候是需要用到的)。例如,一个intent会给一个activity传达一个请求去显式一个图片或者打开一个web页面。在某些情况下,你也可以通过启动一个activity来接受结果,这种情况下,activity将通过intent返回结果(例如,你可以指派一个intent为用户获取个人的联系信息,然后让它返回给你——返回的intent包含一个指向选定的联系信息的URI)。
对于broadcast receivers,intent简单地定义了被广播的公告(例如,一个要指出设备电量过低的广播仅仅包含了一个动作字符串,表示“电量过低”)。
最后一个组件类型content
provider并不被intent激活。准确的说,它是在被作为ContentResolver的请求对象时被激活的。content
resolver处理所有与content
provider之间的直接交互,因此这个组件执行和提供者(provider)之间的交互,并不需要。。。。
(略)
下面是激活每个类型组件的方法:
*你可以通过传递一个intent参数给startActivity()或者startActivityForResult()方法(当你期望activity返回结果时)来启动一个activity(或者让已经存在的activity做一些新的事情)。
*你可以通过传递一份intent参数给startService()来启动一个service(或者给正在运行中的service一些新的指令)。你还可以通过传递一个intent给bindService()来绑定一个service。
*你可以通过传递一个intent给sendBroadcast()、sendOrderedBroadcast()或者sendStickyBroadcast()这样的方法来初始化一个广播。
*你可以调用ContentResover类的query()方法来对content provider进行查询。关于使用intent的更加详细的信息请查看Intents and Intent Fiters文档。
更多关于激活特定组件的信息也会在后边的Activities,Services,BroadcastReceiver and Content Providers文档中提供。
转发请注明:大飞_Rflyee:http://blog.csdn.net/rflyee/article/details/14046561
1、匿名对象:new persion().tell();这样的,它只开辟栈内存,没有栈引用的关系
2、构造方法的名称必须与类名称一致,构造方法的声明处不能有任何返回值类型的声明,不能在构造方法中使用return返回一个值
3、String有两种比较方式:一种是使用“==”完成,比较的是地址值;另一种是使用"equals"方法完成,比较的是具体的内容
4、String类两种实例化方法的区别:
直接赋值:String str1 = "hello"; String str2 = "hello"; String str3 = "hello"; 那这两个地址是相同的,可以有效节省堆内存
通过关键字new赋值:String str = new String("hello");实际是开辟两个内存对象
5、字符串内容的改变,改变的是内存地址的引用关系
6、this关键字的作用:表示类中的属性this.name = name;调用本类的构造方法,构造方法可以互相调用,使用this(参数)的形式完成,注意在使用this关键字调用其他构造方法时,this()调用方法的语句只能放在构造方法的首行,在使用this调用类中其他构造方法时,至少有一个构造方法是不用this调用的,以防止递归调用的情况出现;表示当前对象
7、java常用的内存区域:栈内存-->可以保存对象的名称(更准确地说是保存了引用的堆内存空间的地址);堆内存-->保存每个对象的具体属性;全局数据区-->保存static类型的属性;全局代码区-->保存所有的方法定义
8、使用static方法,不能调用非static的属性或方法
9、java代码块:普通代码块-->使用{}包含的,里面的变量属于局部变量,不能在代码块之外使用;构造块-->将代码块直接定义在类中,构造块优先于构造方法执行,且执行多次,只要一有实例化对象产生,就执行构造块中的内容;静态代码块-->使用static关键字声明的代码块,静态代码块优先于主方法执行,普通类中定义的静态块优先于构造方法执行,不管有多少个实例化对象产生,静态代码块只执行一次。静态代码块的作用主要用于静态属性的初始化
10、
11、final关键字声明类、属性、方法:使用final声明的类不能有子类;使用final声明的方法不能被子类覆写;使用final声明的变量即成为常量,常量不可以修改。
12、抽象类:包含一个抽象方法的类必须是抽象类;抽象类和抽象方法都要使用abstract关键字声明;抽象方法只需要声明而不需要实现;抽象类必须被子继承,子类(如果不是抽象类)必须覆写抽象类中的全部方法;抽象类可以继承抽象类
13、接口是一种特殊的类,里面全部是由全局常量(static final)和公共的抽象方法(abstract)组成,也可以简化定义不写,一个接口不能继承一个抽象类,但是却可以通过extends关键字同时继承多个接口,实现接口的多继承,interface 子接口 extends 父接口A, 父接口B,...{}
14、对象的多态性:对象向上转型:父类 父类对象 = 子类实例; 对象向下转型: 子类 子类对象 = (子类)父类实例;
15、instanceof关键字判断一个对象到底是哪个类的实例,格式:对象 instanceof 类 -》 返回boolean类型
16、
以上的正则,如果想驱动起来,则必须依赖Pattern类和Matcher类,Pattern主要是表达一个规则的意思,即:正则表达式的规则需要在Pattern类中使用。Matcher类主要表示使用Pattern指定好的验证规则。
17、Map接口的常用子类:
HashMap:无序存放的,是新的操作类,key不允许重复
HashTable:无序存放的,是旧的操作类,key不允许重复
TreeMap:可以排序的Map集合,按集合中的key排序,key不允许重复
WeakHashMap:弱引用的Map集合,当集合中的某些内容不再使用时清楚掉无用的数据,使用gc进行回收
IdentityHashMap:key可以重复的Map集合
18、HashMap和HashTable的区别:
性能:HashMap采用异步处理方式,性能更高,HashTable采用同步处理方式,性能较低
线程安全:HashMap属于非线程安全的操作类,HashTable采用线程安全的操作类
空键:允许将Key设置为null,HashTable不允许将Key设置为null,否则将出现Null Pointer Exception异常
19、对象的引用强度说明:
强引用:当内存不足时,JVM能可出现OutOfMemeryError错误而使程序停止,也不会回收此对象来释放内存空间
软引用:当内存不足时,会回收这些对象的内存,用来实现内存敏感的高速缓存
弱引用:无论内存是否紧张,被垃圾回收器发现立即回收
虚引用:和没有任何引用一样
20、Java把内存分成两种,一种是叫做栈内存,一种叫做堆内存,在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。栈内存用于存放由new创建的对象和数组。在堆内存中产生一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊变量就变成数组或者对象的引用变量。实际上栈中的变量指向堆内存中的变量,这就是java中的指针
对于UIControl子类中的
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
和
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
传递中子类监听touchbegin,传递回来给UIControl子类,UIControl子类只能监听对于的touchesBegan,而没有触发beginTracking.
:
在UIControl子类调用
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ NSLog(@"my control touch begin"); [super touchesBegan:toucheswithEvent:event]; UITouch* touch = [touches anyObject]; // Track the touch [self beginTrackingWithTouch:touch withEvent:event]; } - (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { [super touchesMoved:toucheswithEvent:event]; // Get the only touch (multipleTouchEnabled is NO) UITouch* touch = [touches anyObject]; // Track the touch [self continueTrackingWithTouch:touch withEvent:event]; } ....end