当前位置: 编程技术>移动开发
本页文章导读:
▪调用其余应用中的activity 调用其他应用中的activity
app1 org.freedom.app1.HelloActivity app2 org.freedom.app2.TestActivity 如何在app2的TestActivity调用app1的HelloActivity呢?首先在app1的 AndroidManifest.xml中 HelloActivity声明中加入如下内容:.........
▪ UIVew切换卡通效果 UIVew切换动画效果
UIKIT.frame 中的动画时针对UIVew 实现的,而 QuartzCode中的动画时针对 layer 实现的- (IBAction)switchViews:(id)sender{ /* //检查yellowViewController.view 的超视图是否为nil 从而检.........
▪ nio与io的差异 nio与io的区别
nio是new io的简称,从jdk1.4就被引入了。现在的jdk已经到了1.6了,可以说不是什么新东西了。但其中的一些思想值得我来研究。这两天,我研究了下其中的套接字部分,有一些.........
[1]调用其余应用中的activity
来源: 互联网 发布时间: 2014-02-18
调用其他应用中的activity
app1 org.freedom.app1.HelloActivity
app2 org.freedom.app2.TestActivity
如何在app2的TestActivity调用app1的HelloActivity呢?
首先在app1的 AndroidManifest.xml中 HelloActivity声明中加入如下内容:
<intent-filter>
<action android:name=""/>
</intent-filter>
然后就可以调用了
TestActivity 中调用代码如下:
Intent Intent = new Intent();
intent.setClassName("org.freedom.app1", "org.freedom.app1.HelloActivity");
startActivity(intent);
app1 org.freedom.app1.HelloActivity
app2 org.freedom.app2.TestActivity
如何在app2的TestActivity调用app1的HelloActivity呢?
首先在app1的 AndroidManifest.xml中 HelloActivity声明中加入如下内容:
<intent-filter>
<action android:name=""/>
</intent-filter>
然后就可以调用了
TestActivity 中调用代码如下:
Intent Intent = new Intent();
intent.setClassName("org.freedom.app1", "org.freedom.app1.HelloActivity");
startActivity(intent);
[2] UIVew切换卡通效果
来源: 互联网 发布时间: 2014-02-18
UIVew切换动画效果
UIKIT.frame 中的动画时针对UIVew 实现的,而 QuartzCode中的动画时针对 layer 实现的
- (IBAction)switchViews:(id)sender
{
/*
//检查yellowViewController.view 的超视图是否为nil 从而检查使用了哪个视图
//如果 yellowViewController.view 存在,但是并没有向用户显示 那么 self.yellowViewController.view.superview == nil 返回YES
//如果 yellowViewController 不存在,或者yellowViewController已经从内存中擦除,self.yellowViewController.view.superview == nil 同样会返回 YES
if (self.yellowViewController.view.superview == nil) {
if (self.yellowViewController == nil) {
YellowViewController *yellowController = [[YellowViewController alloc] initWithNibName:@"YellowView" bundle:nil];
self.yellowViewController = yellowController;
[yellowController release];
}
[blueViewController.view removeFromSuperview];
[self.view insertSubview:yellowViewController.view atIndex:0];
} else {
if (self.blueViewController == nil) {
BlueViewController *blueController = [[BlueViewController alloc] initWithNibName:@"BlueView" bundle:nil];
self.blueViewController = blueController;
[blueController release];
}
[yellowViewController.view removeFromSuperview];
[self.view insertSubview:blueViewController.view atIndex:0];
}
*/
/* 增加转换动画
//声明动画块,并指定时间
[UIView beginAnimations:@"view Flip" context:nil];//beginAnimations:context: 第一个参数接收动化块名称 第二个参数是一个(void *) 支持指定你希望将其指针于此动画块关联的对象
[UIView setAnimationDuration:1.25];//设置动画曲线,决定了动画的时间
//设置动画改变其速度,中间速度快,开始和结束速度慢
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
if (self.yellowViewController.view.superview == nil) {
if (self.yellowViewController == nil) {
YellowViewController *yellowController = [[YellowViewController alloc] initWithNibName:@"YellowView" bundle:nil];
self.yellowViewController = yellowController;
[yellowController release];
}
//选择翻转效果 缓存cache选项在动画开始时创建快照,并在动画的每个步骤使用这个图像,而不必重新绘制,除非视图在变换过程中需要改变
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
[blueViewController viewWillAppear:YES];//即将显示
[yellowViewController viewWillDisappear:YES];//即将不显示
[blueViewController.view removeFromSuperview];
[self.view insertSubview:yellowViewController.view atIndex:0];
[yellowViewController viewDidAppear:YES];//已经显示
[blueViewController viewDidDisappear:YES];//已经不显示
} else {
if (self.blueViewController == nil) {
BlueViewController *blueController = [[BlueViewController alloc] initWithNibName:@"BlueView" bundle:nil];
self.blueViewController = blueController;
[blueController release];
}
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
[yellowViewController viewWillAppear:YES];
[blueViewController viewWillDisappear:YES];
[yellowViewController.view removeFromSuperview];
[self.view insertSubview:blueViewController.view atIndex:0];
[blueViewController viewDidAppear:YES];
[yellowViewController viewDidDisappear:YES];
}
//启动动画块
[UIView commitAnimations];
*/
//准备动画
CATransition *animation = [CATransition animation];
//动画持续时间
[animation setDuration:1.25f];
//动画速度
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
if (self.yellowViewController.view.superview == nil) {
if (self.yellowViewController == nil) {
YellowViewController *yellowController = [[YellowViewController alloc] initWithNibName:@"YellowView" bundle:nil];
self.yellowViewController = yellowController;
[yellowController release];
}
//动画效果
//kCATransitionFade淡出
//kCATransitionMoveIn覆盖原图
//kCATransitionPush推出
//kCATransitionReveal底部显出来
[animation setType:kCATransitionFade];
//动画方向
//kCATransitionFromRight/ kCATransitionFromLeft(默认值)
//kCATransitionFromTop/kCATransitionFromBottom
[animation setSubtype:kCATransitionFromBottom];
[self.view.layer addAnimation:animation forKey:@"Reveal"];
[blueViewController.view removeFromSuperview];
[self.view insertSubview:yellowViewController.view atIndex:0];
} else {
if (self.blueViewController == nil) {
BlueViewController *blueController = [[BlueViewController alloc] initWithNibName:@"BlueView" bundle:nil];
self.blueViewController = blueController;
[blueController release];
}
//动画效果
//suckEffect三角
//rippleEffect水波
//pageCurl上翻页
//pageUnCurl下翻页
//oglFlip上下翻转
[animation setType:@"rippleEffect"];
//动画方向
//kCATransitionFromRight/ kCATransitionFromLeft(默认值)
//kCATransitionFromTop/kCATransitionFromBottom
//[animation setSubtype:kCATransitionFromBottom];
[self.view.layer addAnimation:animation forKey:@"suckEffect"];//开始动画
[yellowViewController.view removeFromSuperview];
[self.view insertSubview:blueViewController.view atIndex:0];
}
}
UIKIT.frame 中的动画时针对UIVew 实现的,而 QuartzCode中的动画时针对 layer 实现的
- (IBAction)switchViews:(id)sender
{
/*
//检查yellowViewController.view 的超视图是否为nil 从而检查使用了哪个视图
//如果 yellowViewController.view 存在,但是并没有向用户显示 那么 self.yellowViewController.view.superview == nil 返回YES
//如果 yellowViewController 不存在,或者yellowViewController已经从内存中擦除,self.yellowViewController.view.superview == nil 同样会返回 YES
if (self.yellowViewController.view.superview == nil) {
if (self.yellowViewController == nil) {
YellowViewController *yellowController = [[YellowViewController alloc] initWithNibName:@"YellowView" bundle:nil];
self.yellowViewController = yellowController;
[yellowController release];
}
[blueViewController.view removeFromSuperview];
[self.view insertSubview:yellowViewController.view atIndex:0];
} else {
if (self.blueViewController == nil) {
BlueViewController *blueController = [[BlueViewController alloc] initWithNibName:@"BlueView" bundle:nil];
self.blueViewController = blueController;
[blueController release];
}
[yellowViewController.view removeFromSuperview];
[self.view insertSubview:blueViewController.view atIndex:0];
}
*/
/* 增加转换动画
//声明动画块,并指定时间
[UIView beginAnimations:@"view Flip" context:nil];//beginAnimations:context: 第一个参数接收动化块名称 第二个参数是一个(void *) 支持指定你希望将其指针于此动画块关联的对象
[UIView setAnimationDuration:1.25];//设置动画曲线,决定了动画的时间
//设置动画改变其速度,中间速度快,开始和结束速度慢
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
if (self.yellowViewController.view.superview == nil) {
if (self.yellowViewController == nil) {
YellowViewController *yellowController = [[YellowViewController alloc] initWithNibName:@"YellowView" bundle:nil];
self.yellowViewController = yellowController;
[yellowController release];
}
//选择翻转效果 缓存cache选项在动画开始时创建快照,并在动画的每个步骤使用这个图像,而不必重新绘制,除非视图在变换过程中需要改变
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
[blueViewController viewWillAppear:YES];//即将显示
[yellowViewController viewWillDisappear:YES];//即将不显示
[blueViewController.view removeFromSuperview];
[self.view insertSubview:yellowViewController.view atIndex:0];
[yellowViewController viewDidAppear:YES];//已经显示
[blueViewController viewDidDisappear:YES];//已经不显示
} else {
if (self.blueViewController == nil) {
BlueViewController *blueController = [[BlueViewController alloc] initWithNibName:@"BlueView" bundle:nil];
self.blueViewController = blueController;
[blueController release];
}
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
[yellowViewController viewWillAppear:YES];
[blueViewController viewWillDisappear:YES];
[yellowViewController.view removeFromSuperview];
[self.view insertSubview:blueViewController.view atIndex:0];
[blueViewController viewDidAppear:YES];
[yellowViewController viewDidDisappear:YES];
}
//启动动画块
[UIView commitAnimations];
*/
//准备动画
CATransition *animation = [CATransition animation];
//动画持续时间
[animation setDuration:1.25f];
//动画速度
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
if (self.yellowViewController.view.superview == nil) {
if (self.yellowViewController == nil) {
YellowViewController *yellowController = [[YellowViewController alloc] initWithNibName:@"YellowView" bundle:nil];
self.yellowViewController = yellowController;
[yellowController release];
}
//动画效果
//kCATransitionFade淡出
//kCATransitionMoveIn覆盖原图
//kCATransitionPush推出
//kCATransitionReveal底部显出来
[animation setType:kCATransitionFade];
//动画方向
//kCATransitionFromRight/ kCATransitionFromLeft(默认值)
//kCATransitionFromTop/kCATransitionFromBottom
[animation setSubtype:kCATransitionFromBottom];
[self.view.layer addAnimation:animation forKey:@"Reveal"];
[blueViewController.view removeFromSuperview];
[self.view insertSubview:yellowViewController.view atIndex:0];
} else {
if (self.blueViewController == nil) {
BlueViewController *blueController = [[BlueViewController alloc] initWithNibName:@"BlueView" bundle:nil];
self.blueViewController = blueController;
[blueController release];
}
//动画效果
//suckEffect三角
//rippleEffect水波
//pageCurl上翻页
//pageUnCurl下翻页
//oglFlip上下翻转
[animation setType:@"rippleEffect"];
//动画方向
//kCATransitionFromRight/ kCATransitionFromLeft(默认值)
//kCATransitionFromTop/kCATransitionFromBottom
//[animation setSubtype:kCATransitionFromBottom];
[self.view.layer addAnimation:animation forKey:@"suckEffect"];//开始动画
[yellowViewController.view removeFromSuperview];
[self.view insertSubview:blueViewController.view atIndex:0];
}
}
[3] nio与io的差异
来源: 互联网 发布时间: 2014-02-18
nio与io的区别
nio是new io的简称,从jdk1.4就被引入了。现在的jdk已经到了1.6了,可以说不是什么新东西了。但其中的一些思想值得我来研究。这两天,我研究了下其中的套接字部分,有一些心得,在此分享。
首先先分析下:为什么要nio套接字?
nio的主要作用就是用来解决速度差异的。举个例子:计算机处理的速度,和用户按键盘的速度。这两者的速度相差悬殊。如果按照经典的方法:一个用户设定一个线程,专门等待用户的输入,无形中就造成了严重的资源浪费:每一个线程都需要珍贵的cpu时间片,由于速度差异造成了在这个交互线程中的cpu都用来等待。
nio套接字是怎么做到的?
其实,其中的思想很简单:轮询。一个线程轮询多个input;传统的方式是:有n个客户端就要有n个服务线程+一个监听线程,现在采取这种凡是,可以仅仅使用1个线程来代替n个服务线程以此来解决。
具体应用例子:
在ftp的控制连接中,因为只有少量的字符命令进行传输,所以可以考虑利用这种轮询的方式实现,以节省资源。
-----------------------------------------------------
Java中的阻塞和非阻塞IO包各自的优劣思考
NIO 设计背后的基石:反应器模式,用于事件多路分离和分派的体系结构模式。
反应器(Reactor):用于事件多路分离和分派的体系结构模式
通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞 与非阻塞 。所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 。
一种常用做法是:每建立一个Socket连接时,同时创建一个新线程对该Socket进行单独通信(采用阻塞的方式通信)。这种方式具有很高的响应速度,并且控制起来也很简单,在连接数较少的时候非常有效,但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费,如果连接数较多将会出现资源不足的情况。
另一种较高效的做法是:服务器端保存一个Socket连接列表,然后对这个列表进行轮询,如果发现某个Socket端口上有数据可读时(读就绪),则调用该socket连接的相应读操作;如果发现某个 Socket端口上有数据可写时(写就绪),则调用该socket连接的相应写操作;如果某个端口的Socket连接已经中断,则调用相应的析构方法关闭该端口。这样能充分利用服务器资源,效率得到了很大提高。
传统的阻塞式IO,每个连接必须要开一个线程来处理,并且没处理完线程不能退出。
非阻塞式IO,由于基于反应器模式,用于事件多路分离和分派的体系结构模式,所以可以利用线程池来处理。事件来了就处理,处理完了就把线程归还。而传统阻塞方式不能使用线程池来处理,假设当前有10000个连接,非阻塞方式可能用1000个线程的线程池就搞定了,而传统阻塞方式就需要开10000个来处理。如果连接数较多将会出现资源不足的情况。非阻塞的核心优势就在这里。
为什么会这样,下面就对他们做进一步细致具体的分析:
首先,我们来分析传统阻塞式IO的瓶颈在哪里。在连接数不多的情况下,传统IO编写容易方便使用。但是随着连接数的增多,问题传统IO就不行了。因为前面说过,传统IO处理每个连接都要消耗 一个线程,而程序的效率当线程数不多时是随着线程数的增加而增加,但是到一定的数量之后,是随着线程数的增加而减少。这里我们得出结论,传统阻塞式IO的瓶颈在于不能处理过多的连接。
然后,非阻塞式IO的出现的目的就是为了解决这个瓶颈。而非阻塞式IO是怎么实现的呢?非阻塞IO处理连接的线程数和连接数没有联系,也就是说处理10000个连接非阻塞IO不需要10000个线程,你可以用1000个也可以用2000个线程来处理。因为非阻塞IO处理连接是异步的。当某个连接发送请求到服务器,服务器把这个连接请求当作一个请求"事件",并把这个"事件"分配给相应的函数处理。我们可以把这个处理函数放到线程中去执行,执行完就把线程归还。这样一个线程就可以异步的处理多个事件。而阻塞式IO的线程的大部分时间都浪费在等待请求上了。
nio是new io的简称,从jdk1.4就被引入了。现在的jdk已经到了1.6了,可以说不是什么新东西了。但其中的一些思想值得我来研究。这两天,我研究了下其中的套接字部分,有一些心得,在此分享。
首先先分析下:为什么要nio套接字?
nio的主要作用就是用来解决速度差异的。举个例子:计算机处理的速度,和用户按键盘的速度。这两者的速度相差悬殊。如果按照经典的方法:一个用户设定一个线程,专门等待用户的输入,无形中就造成了严重的资源浪费:每一个线程都需要珍贵的cpu时间片,由于速度差异造成了在这个交互线程中的cpu都用来等待。
nio套接字是怎么做到的?
其实,其中的思想很简单:轮询。一个线程轮询多个input;传统的方式是:有n个客户端就要有n个服务线程+一个监听线程,现在采取这种凡是,可以仅仅使用1个线程来代替n个服务线程以此来解决。
具体应用例子:
在ftp的控制连接中,因为只有少量的字符命令进行传输,所以可以考虑利用这种轮询的方式实现,以节省资源。
-----------------------------------------------------
Java中的阻塞和非阻塞IO包各自的优劣思考
NIO 设计背后的基石:反应器模式,用于事件多路分离和分派的体系结构模式。
反应器(Reactor):用于事件多路分离和分派的体系结构模式
通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞 与非阻塞 。所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。而对于非阻塞状态, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待 。
一种常用做法是:每建立一个Socket连接时,同时创建一个新线程对该Socket进行单独通信(采用阻塞的方式通信)。这种方式具有很高的响应速度,并且控制起来也很简单,在连接数较少的时候非常有效,但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费,如果连接数较多将会出现资源不足的情况。
另一种较高效的做法是:服务器端保存一个Socket连接列表,然后对这个列表进行轮询,如果发现某个Socket端口上有数据可读时(读就绪),则调用该socket连接的相应读操作;如果发现某个 Socket端口上有数据可写时(写就绪),则调用该socket连接的相应写操作;如果某个端口的Socket连接已经中断,则调用相应的析构方法关闭该端口。这样能充分利用服务器资源,效率得到了很大提高。
传统的阻塞式IO,每个连接必须要开一个线程来处理,并且没处理完线程不能退出。
非阻塞式IO,由于基于反应器模式,用于事件多路分离和分派的体系结构模式,所以可以利用线程池来处理。事件来了就处理,处理完了就把线程归还。而传统阻塞方式不能使用线程池来处理,假设当前有10000个连接,非阻塞方式可能用1000个线程的线程池就搞定了,而传统阻塞方式就需要开10000个来处理。如果连接数较多将会出现资源不足的情况。非阻塞的核心优势就在这里。
为什么会这样,下面就对他们做进一步细致具体的分析:
首先,我们来分析传统阻塞式IO的瓶颈在哪里。在连接数不多的情况下,传统IO编写容易方便使用。但是随着连接数的增多,问题传统IO就不行了。因为前面说过,传统IO处理每个连接都要消耗 一个线程,而程序的效率当线程数不多时是随着线程数的增加而增加,但是到一定的数量之后,是随着线程数的增加而减少。这里我们得出结论,传统阻塞式IO的瓶颈在于不能处理过多的连接。
然后,非阻塞式IO的出现的目的就是为了解决这个瓶颈。而非阻塞式IO是怎么实现的呢?非阻塞IO处理连接的线程数和连接数没有联系,也就是说处理10000个连接非阻塞IO不需要10000个线程,你可以用1000个也可以用2000个线程来处理。因为非阻塞IO处理连接是异步的。当某个连接发送请求到服务器,服务器把这个连接请求当作一个请求"事件",并把这个"事件"分配给相应的函数处理。我们可以把这个处理函数放到线程中去执行,执行完就把线程归还。这样一个线程就可以异步的处理多个事件。而阻塞式IO的线程的大部分时间都浪费在等待请求上了。
最新技术文章: