android客户端在多个界面切换时保持socket的链接

android客户端在多个界面切换时保持socket的链接
android客户端在多个界面切换时保持socket的链接

android客户端在多个界面切换时保持socket的链接

研究一个socket在多个界面切换时保持链接的问题,现在我提供客户端的源码给有需要的人参考。

1、ApplicationUtil类:

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import https://www.360docs.net/doc/409720617.html,.Socket;

import https://www.360docs.net/doc/409720617.html,.UnknownHostException;

import android.app.Application;

public class ApplicationUtil extends Application{

private Socket socket;

private DataOutputStream out = null;

private DataInputStream in = null;

public void init() throws IOException, Exception{

this.socket = new Socket("192.168.1.104",10202);

this.out = new DataOutputStream(socket.getOutputStream());

this.in = new DataInputStream(socket.getInputStream());

}

public Socket getSocket() {

return socket;

}

public void setSocket(Socket socket) {

this.socket = socket;

}

public DataOutputStream getOut() {

return out;

}

public void setOut(DataOutputStream out) {

this.out = out;

}

public DataInputStream getIn() {

return in;

}

public void setIn(DataInputStream in) {

this.in = in;

}

}

2、AndroidMainifest.xml中application的配置:

package="com.login"

android:versionCode="1"

android:versionName="1.0" >

android:minSdkVersion="10"

android:targetSdkVersion="15" />

android:name="com.util.ApplicationUtil"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

android:name=".LoginActivity"

android:label="@string/title_activity_main" >

3、LoginActivity类:

import java.io.BufferedWriter;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import https://www.360docs.net/doc/409720617.html,.Socket;

import https://www.360docs.net/doc/409720617.html,.UnknownHostException;

import com.login.R;

import com.util.ApplicationUtil;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

public class LoginActivity extends Activity{

private EditText usernameT;

private EditText passwordT;

private Button loginButton;

private Socket socket;

private DataOutputStream out;

private DataInputStream in;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.360docs.net/doc/409720617.html,yout.login);

usernameT = (EditText) findViewById(https://www.360docs.net/doc/409720617.html,ername);

passwordT = (EditText) findViewById(R.id.password);

loginButton = (Button) findViewById(R.id.login);

loginButton.setOnClickListener(new OnClickListener(){

public void onClick(View v) {

ApplicationUtil appUtil = (ApplicationUtil) LoginActivity.this.getApplication();

try {

appUtil.init();

Socket socket = appUtil.getSocket();

out = appUtil.getOut();

in = appUtil.getIn();

} catch (IOException e1) {

e1.printStackTrace();

} catch (Exception e1) {

e1.printStackTrace();

}

String username = usernameT.getText().toString();

String password = passwordT.getText().toString();

MD5 md5 = new MD5();

String ss = md5.MD5(username+"|"+password);

try {

//发送数据

String str = "[login]|"+ss;

out.writeBytes(str);

out.flush();

System.out.println("str ===> "+str);

//创建一个缓冲字节数

int r = in.available();

while(r==0){

r = in.available();

}

byte[] b = new byte[r];

in.read(b);

String result = new String(b,"utf-8");

System.out.println("result = "+result);

if(result.equals("登陆成功0")){

Intent intent = new Intent();

intent.setClass(LoginActivity.this, MainActivity.class);

startActivity(intent);

}

else

{

Intent intent = new Intent();

intent.setClass(LoginActivity.this, MainActivity.class);

startActivity(intent);

}

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

});

}

}

4、MainActivity类:

import java.io.BufferedReader;

import java.io.DataInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import https://www.360docs.net/doc/409720617.html,.Socket;

import com.image.TestActivity;

import com.login.R;

import com.util.ApplicationUtil;

import android.media.RingtoneManager;

import https://www.360docs.net/doc/409720617.html,.Uri;

import android.os.Bundle;

import android.os.Handler;

import android.os.Looper;

import android.os.Message;

import android.provider.MediaStore.Audio;

import android.app.Activity;

import android.app.Notification;

import android.app.NotificationManager;

import android.app.PendingIntent;

import android.content.Context;

import android.content.Intent;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

public class MainActivity extends Activity {

private EditText mess;

private Socket socket;

private Handler handler;

private DataInputStream in;

private NotificationManager nm;

private Notification n;

private int messageNotificationID = 0;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.360docs.net/doc/409720617.html,yout.success);

mess = (EditText) findViewById(R.id.message);

ApplicationUtil appUtil = (ApplicationUtil) MainActivity.this.getApplication();

socket = appUtil.getSocket();

in = appUtil.getIn();

handler = new Handler(){

@Override

public void handleMessage(Message msg) {

//如果来自子线程

if(msg.what == 0x123){

mess.append(msg.obj.toString()+"\n");

//消息通知

mynoti();

}

}

};

//调用线程

myThread();

}

//JA V A可以设置读写缓冲区的大小-setReceiveBufferSize(int size), setSendBufferSize(int size)。

public void myThread(){

Thread oneThread = new Thread(new Runnable(){

public boolean isRunning = true;

public void run() {

while(isRunning){

try {

Thread.sleep(1000);

//创建一个缓冲字节数

int r = in.available();

while(r==0){

r = in.available();

}

byte[] b = new byte[r];

in.read(b);

String content = new String(b,"utf-8");

//每当读到来自服务器的数据后,发送消息通知程序页面显示数据

Message msg = new Message();

msg.what = 0x123;

msg.obj = content;

Log.v("ho", content);

handler.sendMessage(msg);

} catch (IOException e) {

e.printStackTrace();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

});

oneThread.start();

}

public void mynoti(){

NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

// 创建一个通知

Notification mNotification = new Notification();

//用系统自带的铃声

mNotification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");

// mNotification.sound = Uri.parse("file:///sdcard/wen.mp3");

//mNotification.defaults=Notification.DEFAULT_SOUND;

//Notification.FLAG_INSISTENT; //让声音、振动无限循环,直到用户响应

//Notification.FLAG_AUTO_CANCEL; //通知被点击后,自动消失

//Notification.FLAG_NO_CLEAR; //点击'Clear'时,不清楚该通知(QQ的通知无法清除,就是用的这个)

mNotification.flags = Notification.FLAG_NO_CLEAR; ;

//通知时发出的振动

//第一个参数: 振动前等待的时间

//第二个参数:第一次振动的时长、以此类推

long[] vir = {0,100,200,300};

mNotification.vibrate = vir;

mNotificationManager.notify(messageNotificationID, mNotification);

messageNotificationID++;

}

}

5、MD5类:

import java.security.MessageDigest;

public class MD5 {

// MD5加码。32位

public static String MD5(String inStr) {

MessageDigest md5 = null;

try {

md5 = MessageDigest.getInstance("MD5");

} catch (Exception e) {

System.out.println(e.toString());

e.printStackTrace();

return "";

}

char[] charArray = inStr.toCharArray();

byte[] byteArray = new byte[charArray.length];

for (int i = 0; i < charArray.length; i++)

byteArray[i] = (byte) charArray[i];

byte[] md5Bytes = md5.digest(byteArray);

StringBuffer hexValue = new StringBuffer();

for (int i = 0; i < md5Bytes.length; i++) {

int val = ((int) md5Bytes[i]) & 0xff;

if (val < 16)

hexValue.append("0");

hexValue.append(Integer.toHexString(val));

}

return hexValue.toString();

}

}

6、login.xml:

xmlns:tools="https://www.360docs.net/doc/409720617.html,/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:layout_width="fill_parent"

android:layout_height="wrap_content"

>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="账号:"

/>

android:id="@+id/username"

android:layout_width="200dp"

android:layout_height="wrap_content"

android:layout_marginLeft="10dp"

android:layout_marginTop="10dp"

android:layout_marginRight="10dp"

android:hint="账号"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="密码:"

/>

android:id="@+id/password"

android:password="true"

android:layout_width="200dp"

android:layout_height="wrap_content"

android:layout_marginLeft="10dp"

android:layout_marginTop="10dp"

android:layout_marginRight="10dp"

android:hint="密码"

/>

android:id="@+id/login"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="10dp"

android:layout_marginTop="10dp"

android:layout_marginRight="10dp"

android:text="登录"

/>

7、success.xml

xmlns:tools="https://www.360docs.net/doc/409720617.html,/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/success"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="不断接受信息,并提示"

/>

android:id="@+id/message"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:cursorVisible="false"

/>

Android简单的登陆界面的设计开发

通信实训报告 -Android移动平台开发 学院:信息工程学院 班级: 学号: 姓名:

实训内容: 一.1.Andriod的简介 Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。目前,最新版本为Android 2.4 Gingerbread 和Android 3.0 Honeycomb。 Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。 Android早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。2011年初数据显示,仅正式上市两年的操作系统Android已经超越称霸十年的塞班系统,使之跃居全球最受欢迎的智能手机平台。现在,Android系统不但应用于智能手机,也在平板电脑市场急速扩张,在智能MP4方面也有较大发展。采用Android系统主要厂商包括台湾的HTC,(第一台谷歌的手机G1由HTC生产代工)美国摩托罗拉,SE等,中国大陆厂商如:魅族(M9),华为、中兴、联想、蓝魔等。 2.Android构架图 二.1软件下载 Android SDK,网址是https://www.360docs.net/doc/409720617.html,. JDK的下载地址https://www.360docs.net/doc/409720617.html,/javase/downloads/widget/jdk6.jsp。Eclipse的下载网址是https://www.360docs.net/doc/409720617.html,/downloads/ 2.Android开发环境搭建

基于Android的新闻客户端毕业设计

基于Android的新闻客户端毕业设计 1 需求分析 本章首先分析研究背景,介绍了研究目的与意义,接着分析并介绍了系统的功能性需求与非功能性需求。 1.1 研究背景 现在智能手机已经成为人们必不可少的工具,网络也在飞速发展[1],用户从网上获取数据的需求也越来越大,新闻作为人们了解生活变化的重要途径,因此,网上获取新闻的用户数量飞速增加[2]。随着大数据的到来,用户获取资料的方法也随之改变,新闻的发展与人们资料的获取不可分割。现在已出现许多大型的新闻客户端,如:腾讯、新浪、搜狐等[3]。人们可以利用智能手机新闻客户端获取信息,新闻客户端发生如此快速的发展,在于它有以下的特点: (1)便携性:智能手机客户端可以随时,随处的查看新闻,使用方便,可以更好的满足用户需求,用户通过新闻客户端获取新闻逐渐成为趋势。 (2)数据广泛:随着大数据的到来,互联网的信息更加丰富,新闻客户端可以从网上海量的数据中获取资料[4],使得内容更加广泛,远远多于传统的报纸,书籍等获取新闻的方式。 (3)及时性:用户可以随时的登录客户端,通过网络获取数据,智能手机可以随时携带,网络可以随时获取,使得新闻客户端更加的灵活,更好的满足用户的生活需求。 (4)良好的用户体验:用户可以根据自己的爱好,有选择性的阅读新闻,同时可以评论新闻,参与互动,并且可以查看其他用户的看法,参考别人意见,更好的了解人们的生活动态。 1.2 项目目的及意义 在满足用户可以分类获取新闻的同时,增加跟帖,收藏新闻等功能,用户可以查看跟帖与用户个人收藏,使用户更加具有参与性,成为有观点的阅读者[5],使新

闻更加具有可读性。用户可以根据跟帖数和跟帖内容,更加快速的获取热门新闻,更快的选择新闻,节约用户的选择时间,更快的获取新闻,这样更具有用户体验,更容易满足用户的需求。 Android新闻客户端目标:在满足用户查看新闻的基础上,更重要的是给用户更好的阅读体验[6],使用户可以在短的时间内获取多的自己感兴趣的新闻信息。为了达到以上目的,从而实现以下功能: (1)对新闻进行分类显示,使用户可以分类选择自己喜欢的新闻,更加高效,快速,分别设置了如下分类:国内、国际、军事、体育、科技、财经、游戏。 (2)用户可以注册,登录,同时可以评论新闻,查看评论,使用户可以根据新闻的评论数与评论内容,更好、更快的选取新闻。 (3)用户可以收藏新闻,并且查看收藏的新闻,使用户可以及时的翻看已经看过的感兴趣的新闻,加快用户的搜索效率。 (4)采用异步加载数据,给用户更好的体验,同时减少了用户的等待时间,更好的满足用户需求。 (5)增加个人信息设置,实现用户登录,修改个人信息,查看自己的收藏。 (6)增加夜间模式的设置,满足用户夜间阅读新闻的需求,给用户带来更好的体验。 后天管理目标:实现对新闻的增删改查,对用户评论的显示与删除,以及对用户的增删改查。 1.3 Android介绍 Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备上[7]。Android的创始人是Andy Rubin,Android一词出自于科幻小说《未来夏娃》[8]。 Android系统是一个四层的结构,依次是Linux内核层(Linux kernel)、系统运行库层(Libraries和Android Runtime)、应用框架层(Application Framework)、

Android客户端缓存方案

概述: 客户端缓存机制是android应用开发中非常重要的一项工作,使用缓存机制不仅仅可以为用户节省3G流量,同时在用户体验方面也是非常好的选择. 缓存机制分为两部分,一部分是文字缓存,另一部分是多媒体文件缓存. 缓存文件保存策略: 1.文字缓存: 文字缓存应该分为两种,一种是更新比较频繁的区域,一种是更新不频繁的区域. 根据两者的更新频率区分它们的过期时间. 更新比较频繁的区域,它的缓存过期时间应该为应用程序内(即应用程序从打开到关闭的这段时间).这种情况会有专门的缓存文件夹存放该类缓存文件,以及专门的缓存数据库表存放信息.每次应用程序启动的时候都会先将该类数据清空. 另一种很少更新的区域,它的缓存不设置过期时间,而是提供一个按钮或者Menu可以让用户选择手动更新(如我的好友列表,我的订阅,我的分享.等等….) 具体的文字缓存划分,详见附录1. (1)通常情况下,我们与服务器交互都是采用JSON格式获取数据的,获取的JSON数 据仅仅是一段字符串,我们可以考虑将这些字符串使用文件流写入一个TXT,保存到 SD卡中,在数据库添加该数据的记录.添加数据库记录时,提供两个关键字段,一个是 请求的URL,另一个则是本地保存后的文件地址.日后每次向服务器发起请求之前都会根据URL在数据库中检索. 该方法好处:降低系统数据库数据量,不会出现数据库满了的现象. 缺点:IO操作频繁,有时代码书写有误会造成内存泄露等状况. (2)将JSON数据解析后装入List对象中,然后遍历List,将数据统统写入相应的 数据库表结构中,以后每次向服务器发起请求之前可以先在数据库中检索,如果有直接返回. 该方法好处:如果本地存在文字缓存,那么读取缓存速度快. 缺点:增加数据库数据量. 2.多媒体文件缓存 (1)图片缓存 图片的缓存可以根据当前日期,时间为名字缓存到SD卡中的指定图片缓存目录, 同时数据库中做相应记录,记录办法可以采用两个关键字段控制,一个字段是该图片 的URL地址,另一个字段是该图片的本机地址.取图片时根据URL在数据中检索, 如果没有则连接服务器下载,下载之后再服务器中作出相应记录. (2)视频文件缓存 考虑到视频文件就是动画片,每一集的大小应该超过20MB,如果边播放边下载的话 用户的3G流量负担是很大的,而且用户看完一集动画片,基本上不会再去看第二遍. 从这个状况来看,建议不要对视频文件进行下载缓存.另外也能降低程序员的编码负 担.

Android人机界面(UI)设计规范(带目录)

Android 人机界面设计规范 1Android 设计的依据 1.1 框架结构及流程 是什么使得android 有着独特的用户体验? 后台处理支持多任务功能 正在进行和事件驱动的提示信息 通过Widgets 和live folders 来实现实时信息的预览 用户想用时,任一应用程序都可以挑选和选择 android 不是关于程序的,它是关于活动,把任务分层, 1.2 架构基础 硬件平台 android 设备代表的是硬件和软件的完美组合。硬件辅助导航操作,并给android 提供更多更好的功能。当菜单没有开启,要把屏幕最大化时,菜单按钮可以在屏幕上提供更多的内容。返回按钮允许使用返回堆(back stack)。 竖屏与横屏 一般来说,用户界面开发竖屏与横屏。在新横屏也仍存在于新的Android 手机中。99%的android 布局支持横屏。 焦点和菜单 在触摸模式里没有焦点,只有轨迹球。Android 平台里没有鼠标焦点。确定你从未显示焦点。主菜单应该包括全部功能;它们与活动联系一起形成整体。菜单上的图标按重要性排序。如果有多于5 个图标,使用点击more menu 菜单来查看那些不太重要的菜单项。上下文菜单(长按)集中在一个特定对象。 总是把那些与所选项最相关的行为放在长按菜单的顶部。 需要记住的几点: 设计时要考虑速度和简洁 尽量分层来分等级 屏幕上的活动尽量最小 使用下载进度条,下载数据时,而不是让用户等待去看一个加载完全的页面。 考虑活动流而不是线性行为 1.3 屏幕上的行为

android 设计了特定的行为方式。在你的应用程序里利用好这一点。应该坚持android 行为的标准,避免混淆用户。 1.4 表达 细节使得产品集中在细节。程序的美学会帮助你集中注意在那些应用体验核心的关键任务上。API DEMO 是开始你的工具包的好地方。 2 用户界面原则 这部分试图讲述创造一个好的用户界面的一些基本的交互设计原则。这些原则是基本的,不止能应用于android 的用户界面设计,也可以应用于其他。苹果建议开发者花费60%的开发时间来进行设计工作。下面的用户界面原则将为好的设计提供一个基础。 2.1 隐喻 隐喻是构建一个基于操作任务心智模型的模块;用它们来传递应用程序的概念和功能。基于真实世界的应用对象可以帮助用户很快的理解该应用程序。当你设计你的应用程序时,要注意andriod 中存在的隐喻,不要重新定义它们。同时,检查你的应用程序执行的任务,看是否有些自然隐喻你可以使用。 2.2 反映用户的心智模型 用户已经有了一个来描述你的程序正在进行的任务的心智模型。这个心智模型产生于真实世界经验、其它软件和一般电脑基本知识的结合。比如说,用户在真实世界里有写字、寄信的经验,也会产生特定的期待,像写一封新的信,选一个接受者,然后寄出信。一个忽略用户心智模型的电子邮件程序用起来会很困难和不舒服。这是因为程序强加给用户一个不熟悉的概念模型,而不是建立一个用户已有的知识经验模式。 在设计程序用户界面之前,试着去发现你的用户的心智模型,这样帮助用户去执行任务。心智模型中内在的隐喻,它代表了任务的概念组成。在写信这个例子中,隐喻包括信件、邮包和信封。在涉及到照片的任务的思考模式中,隐喻包括照片、照相机和专辑。我们要努力地发现用户的期望,包括任务组成、组织、窗口布局的工作流、菜单和工具栏组织、控制面板的使用。 要通过努力地何必把个下面的特征与用户心智模型相融合: 熟悉性 用户的心智模型主要是建立在经验的基础上 简单化 一项任务的心智模型通常是流线型,关注任务的基本组成部分。尽管对于一个给定的任务有很多可选的细节,但是基本的组成部分占大部分,并且不会占用用户的注意。 可利用性Availability

第4章 Android用户界面设计

视图组件的使用模式 常用组件 高级组件 提示框与警告对话框

就是Android应用程序的开发过程。一般过程是先通过XML布局文件或Java代码创建界面布局,设定组件显示样式,随后获取UI组件对象,并处理组件事件响应。 视图组件的定义 资源的访问 生成视图组件资源标识 视图组件的引用 视图组件的事件响应 组件的常用属性

1.1视图组件的定义 使用XML布局文件定义视图组件 使用Java代码定义视图组件(不推荐)

1.1视图组件的定义 使用XML布局文件定义视图组件 Android平台为大多数视图组件以及其子类提供了XML标记,可通过XML布局文件中的标记来定义视图组件。XML中的每个元素代表了一个组件,即元素名称对应相应的Java类。

1.1视图组件的定义

相关文档
最新文档