当前位置:  编程技术>移动开发
本页文章导读:
    ▪讯息推送        消息推送 关于服务器端向Android客户端的推送,主要有三种方式:轮询,应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消.........
    ▪ Scene其间的数据传递        Scene之间的数据传递 假设两个ViewController之间已经建立了Segue A:TableViewController的子类   B:viewController  A --> B 传送数据类Player的对象player 1.设置Segue的identifier 2.在B.h里添加 @property(nonatomic,stron.........
    ▪ Titanium+JQuery调整       Titanium+JQuery整合 Titanium和JQuery整合的结构如下:   登录之后:     Titanium源代码如下: App.js   /* * Single Window Application Template: * A basic starting point for your application. Mostly a blank canvas. * * In.........

[1]讯息推送
    来源: 互联网  发布时间: 2014-02-18
消息推送

关于服务器端向Android客户端的推送,主要有三种方式:轮询,应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池;SMS(通过发送短信并解析短信内容来获取服务器端的指令),这个出现的问题是很难找到免费的网关来发送短信;最后就是持久连接,主要是Socket通讯,这个解决了性能问题,但是耗电问题依旧没能解决。

在这里,我们主要介绍的是第三种,用持久连接的方式来进行推送。现在比较成熟的及时消息传递协议共有四种,而无疑最为主流就是XMPP协议,它是一种基于XML的传递协议,具有很强的灵活性和可扩展性。它的特点是将复杂性从客户端转移到了服务器端。在网上可以找到很多的XMPP资料,这里就不在赘述了,不然越扯越多。总之,XMPP主要显著的优点主要有以下几个方面:

1、 分布式  任何人都可以运行自己的XMPP服务器,它没有主服务器

2、 安全性很高。使用SASL及TLS等技术的可靠安全性

3、 开发性 它是开源的,易于进行学习和了解

4、 跨平台  毋庸置疑,使用的XML进行传输的

说完优点,我们言归正传,基于XMPP协议的java开发有一个开源框架,那就是smack,它主要封装了一些XMPP的实现。而如果把它直接用在Android上是不行的,因为android缺少了一些java的类库,于是一个改进版的asmack诞生了,它是专门为android而改进的android smack。而另外一个开源框架的诞生,则是对在引用smack的基础上实现和服务器端的持久连接,以实现服务器对客户端的推送,那就是android push notification,简称androidpn。

Androidpn在客户端集成了asmack。这样就可以很容易的简立一个和服务器端的基于xmpp协议的socket连接。Androidpn的客户端中,进行管理连接的类是XmppManager,它主要用来管理连接的信息,比如XMPP的端口、IP、登录的用户名密码,以及对连接的维护。为什么还有用户名和密码?这不得不提到XMPP的具体细节。整个服务器端和客户端的通信是基于一个session(会话)过程,会话开始,首先会指定服务器的端口号,然后把上述提到的信息发送到服务器端,怎么发送消息的呢?以<stream>根节点的方式开始传递,只有在服务器和客户端关闭的时候才会发送它的结束标记</stream>。客户端通过XMPP协议只用做的就是接收消息,而所有其它的操作都交给服务器,比如管理连接、消息保存等等,这样就很大程度的减轻了客户端的负担。那么客户端和服务器端的消息回应是如何实现的?如要通过一个ID来标识,具体细节可以去查看XMPP协议。

一旦注册绑定后,服务器端就和客户端建立了连接,客户端只用负责去接收消息。所以当我们应用Androidpn的时候,客户端会非常的简单。而在服务器端,Androidpn又做了什么呢?

服务器端的展示方面,androidpn主要用到的技术是Spring和Hibernate。主要是用来展示用户状态和发送信息用的,如下图:

 



 

 

这方面的技术已经比较成熟,就不再细说了,主要要说的还是XMPP的管理。在服务器端的源码中一个org.androidpn.server.xmpp.net.Connection类,主要是代表一个服务器上的XMPP连接,注意只是一个,它可以确保在服务器关闭的时候,发送一个</stream>标记到客户端,告知连接断开,需重新连接。

org.androidpn.server.xmpp.session.SessionManager主要用户管理所有会话,比如连接断开,删除session以及建立连接,添加session等等。

而在管理Socket连接的时候,androidpn采用了MINA框架来进行管理,MINA的优点就是改变了我们传统的管理socket的方式,比如没建立一个socket开一个线程,而MINA可以实现多个线程管理N多个用户。在处理高并发的推送上无疑是有巨大的好处的。

合理的利用监听器来管理session,也是androidpn的优点。在安全性方面,制定了TLS(安全传输层)策略,并却采用了安全认证,这些方面都做的不错。

当然,不可避免的30秒钟的心跳包还是必不可少的。

总之,用Androidpn好处有以下方面:采用完全开放的XMPP协议进行数据传输(QQ,MSN,GTalk等都是采用的这种协议);良好的框架支持(专门为android 而产生的推送框架asmack,以及很好的管理socket的框架MINA,都是很成熟的产品);完全开放的源代码(我们可以在androidpn的基础上进行修改,来满足我们的任何需求变更);大大的减少了客户端的代码,降低了android的开发难度。缺点不言而喻,使用了太多的框架,如果想要改一些具体的实现,可能会迁移发动全身。不过如果你个懒人的话,完全满足你的需求了。

 

最后是我整理的androidpn的源码,完全可以使用。原来的服务器端用的jetty框架来代替tomcat的,我把它又重新整合到了tomcat下,可以完美的和你的服务器端融合。懒人们,来吧~~由于文件过大,所以用了外连~~喜欢的就去下载吧。。只需要改下client的raw文件夹下的ip地址就可以运行。。androidpn下载地址


    
[2] Scene其间的数据传递
    来源: 互联网  发布时间: 2014-02-18
Scene之间的数据传递

假设两个ViewController之间已经建立了Segue

A:TableViewController的子类   B:viewController  A --> B 传送数据类Player的对象player

1.设置Segue的identifier

2.在B.h里添加

@property(nonatomic,strong) Player *player;

   在B.m里添加

 

@synthesize player;

3.在A.m里重写UIViewController 的以下方法

 

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    UIViewController *destination = segue.destinationViewController;
    if ([destination respondsToSelector:@selector(setPlayer:)]){//判断目标是否存在setPlayer方法
        [destination setValue:selectedPlayer forKey:@"player"];
    }
}

4.在A.m里重写

 

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    selectedPlayer = [players objectAtIndex:indexPath.row];
    return indexPath;
}

   说明:之所以不重写

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

是因为执行顺序,不然会取不到值:

willSelectRowAtIndexPath --> prepareForSegue --> didSelectRowAtIndexPath

 

5.OK,传送成功!在B里已经可以用player对象了。


    
[3] Titanium+JQuery调整
    来源: 互联网  发布时间: 2014-02-18
Titanium+JQuery整合

Titanium和JQuery整合的结构如下:

 

登录之后:

 

 

Titanium源代码如下:

App.js

 

/*
 * Single Window Application Template:
 * A basic starting point for your application.  Mostly a blank canvas.
 * 
 * In app.js, we generally take care of a few things:
 * - Bootstrap the application with any data we need
 * - Check for dependencies like device type, platform version or network connection
 * - Require and open our top-level UI component
 *  
 */

//bootstrap and check dependencies
if (Ti.version < 1.8 ) {
	alert('Sorry - this application template requires Titanium Mobile SDK 1.8 or later');
}
else if (Ti.Platform.osname === 'mobileweb') {
	alert('Mobile web is not yet supported by this template');
}
else {
	//require and open top level UI component
	var ApplicationWindow = require('ui/ApplicationWindow');
	new ApplicationWindow().open();
}
 

ApplicationWindow.js

 

 

//Application Window Component Constructor
function ApplicationWindow() {
	//load component dependencies
	var FirstView = require('ui/FirstView');
		
	//create component instance
	var self = Ti.UI.createWindow({
		backgroundColor:'#ffffff',
		navBarHidden:true,
		exitOnClose:true,
		title:'JQuery和Titanium的整合'
	});
		
	//construct UI
	var tableview = new FirstView();
	
	
	//Header
    var header = Titanium.UI.createView({
        height:'50dp',
        backgroundColor:'#000',
        backgroundImage:'../images/title.png',
        top:'0dp'
    });
    var header_lbl = Titanium.UI.createLabel({
        text: '易程科技股份有限公司',
        color: '#fff',
        font: {fontSize: 22, fontWeight: 'bold'},
        top:'5dp',
        height:'40dp'
    });
    header.add(header_lbl);
    self.add(header);
    
    
    self.add(tableview);
 
    //Footer
    var footer = Titanium.UI.createView({
        height:'50dp',
        backgroundColor:'#000',
        bottom:'0dp',
        backgroundImage:'../images/foot.png',
    });
    var footer_lbl = Titanium.UI.createLabel({
        text: '',
        color: '#fff',
        font: {fontSize: 22, fontWeight: 'bold'},
        top:'5dp',
        height:'40dp'
    });
    footer.add(footer_lbl);
    
    self.add(footer);
	
	return self;
}

//make constructor function the public component interface
module.exports = ApplicationWindow;
 

FirstView.js

 

//FirstView Component Constructor
function FirstView() {
	// Create an ImageView.
	var anImageView = Ti.UI.createImageView({
		image : '../images/beforeforward.png',
		width : 50,
		height : 50
	});
	
	var data = [
		{
			winId:'txxxt1',
			'color':'#000000',
			'backgroundColor':'#FAFAFA',
			title:'故障信息上报', 
			url:'../htmls/html/index.html',
			data:JSON.stringify({title:'障处理'}),
			leftImage:"../images/w.bmp",
			hasChild: true
		},
		{
			winId:'txxxt5',
			'color':'#000000',
			'backgroundColor':'#FAFAFA',
			title:'当前故障一览', 
			url:'../htmls/html/index.html',
			data:JSON.stringify({title:'当前故障一览',type:4}),
			leftImage:"../images/w.bmp",
			rightImage:"./images/beforeforward.png",
			hasChild: true
		}
	];
    
    // Table
	var tableview= Ti.UI.createTableView({
        data: data,
        top:'50dp',
        bottom:'50dp',
        //This is what I used to do to include a header/footer
        // headerView: header,
        // footerView: footer
    });
    
    
    
    // create table view event listener
	tableview.addEventListener('click', function(e) {
		if(e.rowData.url) {
			//if(null==dataWins[e.rowData.winId]){
				var win = Ti.UI.createWindow({windowSoftInputMode:Ti.UI.Android.SOFT_INPUT_ADJUST_RESIZE});
				
				var webview = Ti.UI.createWebView({
					url:e.rowData.url
				});
				win.add(webview);
				var label = Ti.UI.createLabel({
					text : 'loading....'
				});
				label.addEventListener('click', function(ex) {
					webview.reload();
				});
				win.add(label);
				
				win.addEventListener('open', function(ex) {
					Ti.App.fireEvent('currWin', {view:webview});
				});
				
				webview.SysDatas=[e.rowData.url];
				win.addEventListener('android:back', function(ex) {
					if(webview.SysDatas.length>1){
						webview.url=webview.SysDatas[webview.SysDatas.length-2];
						webview.SysDatas.splice(webview.SysDatas.length-1,1)
						return;
					}
					win.close();
					webview.url='';
				});
				
				webview.addEventListener('load', function(ex) {
					win.remove(label);
				});
			//}
			//是否采用模式窗体
			win.open({
					fullscreen : false,modal : true,
					animated : true,
					windowSoftInputMode : Ti.UI.Android.SOFT_INPUT_ADJUST_RESIZE,
					exitOnClose: true,
					navBarHidden:true,
					backgroundImage : '/images/default.png',
			});
		} else if(e.rowData.href) {
			Titanium.Platform.openURL(/blog_article/e.rowData.href);
		}
	});

	return tableview;
}
module.exports = FirstView;

 

index.html

 

<!DOCTYPE html>
<html>
	<head>
		<title>易维云平台      首页</title>
		<meta charset="utf-8">
	    <meta name="viewport" content="width=device-width, initial-scale=1">
		<meta http-equiv="content-type" content="text/html; charset=UTF-8">
		<script type="text/javascript" charset="utf-8" src="/js/jquery.js"></script>		
		<script type="text/javascript" charset="utf-8" src="/js/jquery.mobile-1.0a4.1.min.js"></script>
		<link rel="stylesheet" href="/css/jquery.mobile-1.0a4.1.min.css" type="text/css" />
		<meta name="format-detection" content="telephone=no"/>
	</head>
<style type="text/css"> 
p { 
	font-size: 1.5em; 
	font-weight: bold; 
} 
#submit{ 
	float:right; 
	margin:10px; 
} 
#toregist{ 
	float:left; 
	margin:10px; 
} 
</style>
<body>
	<div  data-role="page" id="main" data-theme="b" >
	         <!-- header -->
				<div data-role="header"  data-theme="b" >
						<h3>
							易维云平台
						</h3>
					
				</div>
				<!-- /header -->
	
				<div data-role="content"  data-theme="b" data-position="fixed"  >
		            <p ><font color="#2EB1E8" ></font></p>
					<form method="post" id="loginform">
					<label for="username" >用户名:</label>	
					<input type="text" name="username" id="username" value="请输入注册的手机号码" />
					<label for="password" >密&nbsp;&nbsp;&nbsp;&nbsp;码:</label>
					<input type="password" name="password" id="password" value="请输入登录密码" />
						<fieldset data-role="controlgroup" >
							<input type="checkbox" name="checkbox-1" id="checkbox-1"  />
							<label for="checkbox-1">保持登录状态</label>
						</fieldset>
						<a href="/html/register.html" data-role="button" id="toregist" data-theme="e">注册</a>
						<a data-role="button" id="submit" data-theme="b" href="/html/taskmgr.html" >登录</a>
					</form>
				</div>
	             <div >&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;</div>
				<div data-role="footer"  data-theme="b" data-position="fixed" >
				 	 <img alt="" src="/logo.gif" />
				</div>
	</div>
	</body>
</html>
 

 

 

 

 

 



    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3