Android利用activity启动模式退出整个应用以及客户端与服务器交互

1.退出单个activity
1)、获取当前进程的id,杀死该进程。android.os.Process.killProcess(android.os.Process.myPid())
2)、终止当前正在运行的Java虚拟机方法。System.exit(0); 

3)、finish();
4)、杀包方式。
  ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);   
  manager.restartPackage(getPackageName()); 
  添加权限:<uses-permission android:name="android.permission.RESTART_PACKAGES" />;
(在2.2之前可以利用这个退出应用,很遗憾android2.2后失效了,连单个activity都结束不了)

2.退出整个应用(多个Activity)

   以下我直接列出网上给出的几种方案,就不做详细说明了。
1)、制造抛异常导致程序强制退出:

2)、用个容器记录每个打开的Activity,在需要退出的时逐一关闭每个Activity

3)、广播方式:

4)、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

3.接下来看一下怎么利用activity启动模式退出整个应用,在这之前我简单的说下activity四种模式的概念,因为这个退出方法跟   activity的启动模式有一定的关系;

1)、standard 模式;也就是默认模式,每次激活Activity时都会创建一个Activity实例,并放入任务栈中。

2)、singleTop 模式;如果在任务栈中的栈定存在该Activity实例,下次激活该Activity实例时就不会创建新的 Activity的实例,直接重用它(在重用的这个过程中会调用实例的OnNewIntent()这个方法),否则就创建新的Activity实例。

3)、singleTask 模式;如果在栈中已经有该Activity的实例,以后就不会创建新的实例了,而会重用该实例(在重用的这个过程中会调用实例的OnNewIntent()这个方法)。重用时,如果该Activity实例不是在栈顶,它会让该实例回到栈顶,而它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。

4)、singleInstance 模式;在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。

在android系统中,要想直接的关闭整个应用,这是不可能的,而在项目中当需要关闭整个应用时几乎都是采用间接的办法,以上列出的几种方案中其原理都是逐一关闭activity(制造抛异常导致程序强制退出除外),然后退出程序。接下来我们也利用这个原理来实现退出整个应用的目的,在activity启动模式singleTask 模式中,刚才提到如果该Activity实例存在但不是在栈顶,它会让该实例回到栈顶,而它上面的实例将会被移出栈。这样子,我们就可以将应用中的主入口Activity(这里假设主Activity为MainActivity)设置成singleTask 模式,这样子我们就保证了这个Activity实例存在于栈底中,后面不管有多少其他Activity实例添加进来它始终会在栈底,这时我们只要在要关闭整个应用的那个Activity中把他转到这个Activity来(startActivity(xx.this,MainActivity.class));这样子其他的activity实例就会被移出栈,这时栈中只剩MainActivity实例,如果此时要是再能让这个MainActivity实例移除出栈,那么我们就达到了关闭整个应用的目的,不知道大家刚才有没有注意到OnNewIntent()这个方法,这个方法就是重用activity实例时会被调用,因此我们只要在MainActivity重写该方法并加上一句finish()来关闭当前activity实例我们的目的就达到了……

package com.test.launchmode;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class  MainActivity extends Activity {
@Override
protected final void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  startActivity(new Intent(this,xx.class));
}

@Override
protected void onNewIntent(Intent intent) {
  // TODO Auto-generated method stub
  super.onNewIntent(intent);
  this.finish();
}
}


Android客户端与服务器数据交互流程
一个门户网站的制作的流程:首先,由网页设计师只做网页设计,即画出来网站在浏览器中显示的样子,然后由前端人员编写Html+CSS+JS来实现网站的动态效果,比如说导航栏的下拉显示,然后Ajax的局部信息更新等,然后通过后台程序如JSP,PHP, .NET等语言将数据库中的信息与前台页面相结合,这样,一个站就这样被建好了。而Android客户端,也是有UI设计师,UI前端,程序构成的,同样程序这边的话,最近Html5+CSS3的火热开启,很多公司也需要html5+css3进行Android程序的开发了。呜呜,抢我的饭碗。虽然说哥也是懂html+css的。嘿嘿,这样解释的话,可能大家不清楚,其实木有必要弄清楚网站的建站过程,这里只是给大家普及一下知识,没必要弄清楚。
基础知识:我们需要知道,Http协议是基于TCP协议的,而TCP协议是一种有连接,可靠的传输协议,如果丢失的话,会重传。所以这样的话,就不会有数据的丢失了。而Http协议有三种方法,Get,Post,Head方法,但是用的多的只有GetPost方法,Get方法是将请求参数放在请求头中,所以请求的参数在URL中可见,而Post方法是将请求参数放在数据部分,所以在URL中不可见,Post相对来说保密,所以在提交重要信息的时候,用的都是HttpPost方法来实现的,比如说,注册账号密码就是使用的HttpPost,因为账号密码需要保密,而上百度搜索安卓巴士,在浏览器的地址栏中就会显示这种URL,其中wd=XXX是经过加密后的安卓巴士,其他的参数也是必须要的请求参数http://www.baidu.com/s?wd=%E5%AE%89%E5%8D%93%E5%B7%B4%E5%A3%AB&rsv_spt=1&issp=1&rsv_bp=0&ie=utf-8&tn=baiduhome_pg&inputT=11996
而在B/S模式中,B代表浏览器,S代表服务器,在浏览器和服务器的通信之中,因为B/S之间不会一直保持连接,所以才会加入Cookie机制,来辨认所操作的对象。用户浏览网页的操作如下:当用户点击一个连接或者一个按钮的时候,浏览器通过发送一个请求给服务器,然后由服务器接收该请求,然后解析到用户请求的是哪些内容,然后查找到相关资源,再将数据返回给浏览器,由浏览器解析数据,然后显示给用户看到用户所需要看到的页面。所以,AndroidB/S模式差不多,其实也就是发送请求,接收数据,然后解析数据,显示到手机上的过程,没什么太大的区别,谁让咱用的是互联网,用的是TCP/IP协议呢,是吧。要理解是:所有的操作都是向服务器请求数据的过程。
  1. 首先,我们要熟悉Android的HttpGet和HttpPost请求。其中Apache公司已经提供了两个类,叫:HttpGet和HttpPost两个类。两个类的用法不同,不解释贴代码:
  2. 1.        使用HttpGet请求Baidu的主页:
  3. //使用HttpGet方法,把百度的主页传入
  4. HttpGet hettpGet = new HttpGet("http://www.baidu.com/");
  5. //使用默认的HttpClient
  6. HttpClient hc = new DefaultHttpClient();
  7. try {
  8. //执行HttpGet方法,并且获取返回的响应
  9.         HttpResponse response = hc.execute(hettpGet);
  10. //如果响应码为200则表示获取成功,否则为发生错误
  11. if (response.getStatusLine().getStatusCode() == 200) {
  12. //s就是获得的HTML代码
  13.         String s = EntityUtils.toString(response.getEntity());
  14.         System.out.println(s);
  15. }
  16. } catch (ClientProtocolException e) 
  17. {
  18.         e.printStackTrace();
  19.         } catch (IOException e) 
  20. {                                            e.printStackTrace();
  21.                                 } 
复制代码

    这样就向百度服务器发送了一个HttpGet请求,请求的是百度的搜索首页,服务器返回来都是Html代码,只是浏览器有解析HTML的功能,将HTML代码转换成所显示的页面,所以,打印出来的都是HTML代码。
      
  1. //使用HttpPost发送请求
  2. HttpPost httpPost = new HttpPost(url);        
  3. //使用NameValuePaira保存请求中所需要传入的参数
  4. List<NameValuePair> paramas = new ArrayList<NameValuePair>();
  5.         paramas.add(new BasicNameValuePair("a", "a"));
  6.         try {

  7. HttpResponse httpResponse;
  8. //将NameValuePair放入HttpPost请求体中
  9. httpPost.setEntity(new UrlEncodedFormEntity(paramas,
  10.                                                         HTTP.UTF_8));
  11. //执行HttpPost请求
  12. httpResponse = new DefaultHttpClient().execute(httpPost);
  13. //如果响应码为200则表示获取成功,否则为发生错误
  14. if (httpResponse.getStatusLine().getStatusCode() == 200) {
  15. String s = EntityUtils.toString(httpResponse
  16.                                                 .getEntity());}
  17.                                 } catch (UnsupportedEncodingException e) {
  18.                                         // TODO Auto-generated catch block
  19.                                         e.printStackTrace();
  20.                                 } catch (ClientProtocolException e) {
  21.                                         // TODO Auto-generated catch block
  22.                                         e.printStackTrace();
  23.                                 } catch (IOException e) {
  24.                                         // TODO Auto-generated catch block
  25.                                         e.printStackTrace();
  26.                                 }    
复制代码
这样就发送了一个HttpPost请求了。简单吧。所有的获取数据操作基本上都是在HttpGetHttpPost上拓展开的,然后发送了请求之后呢,服务器就会接受到一个请求了,服务器接收到请求就会通过方法来接收到 Android客户端中发送的参数,并且通过后台程序来解析参数,然后通过数据库查找到所需要的信息,然后通过PHP后台将数据处理成JSON数据格式返回给HttpResponseEntity,然后通过EntitiyUtils.toString方法来将Entity转化成为String对象,然后所得到的String对象呢就是一个JSON数据了。接下来的事情就是JSON数据的解析啦。   
最后简单说一下动态建站的过程吧:页面分为两种,一种静态的,一种动态的,现在静态的站基本上都没了,全是动态的了,静态页面全是用Html+CSS写的,只能实现简单的从一个页面打开另外一个页面,没有与服务器进行数据交互的过程,只是进行简单的加载静态页面,不会有数据从数据库里面进行差删改查等操作,并且不用使用模板生成器生成文件,再将文件内容返回给浏览器呢而其中呢,而动态建站的过程就是这样的:首先由发送请求给服务器,然后服务器通过数据库查询数据,然后再将查询出来的数据与模板生成器结合,生成一个.php文件,然后浏览器会将php文件解析成为html然后显示在浏览器上显示。


android联系人txt文本格式导出
一、联系人信息的读取
  1. ContentResolver cr=getContentResolver();
  2. Cursor cursor=cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, "sort_key_alt");

  3. while(cursor.moveToNext()){
  4. String phoneNumber=null;
  5. String name=cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME));
  6. String id=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
  7. Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id, null, null); 
  8. while(phone.moveToNext()){
  9.         phoneNumber=phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
  10.        }
  11.        String geshi=name+"\t\t\t"+phoneNumber+"\n";


复制代码
下面简单的介绍下。首先定义一个ContentResolver用于查询联系人数据库。查询方式query(ContactsContract.Contacts.CONTENT_URI, null, null, null, "sort_key_alt");其中第一个参数为联系人的uri。最后一个参数表示按照联系人姓名降序查询。该方法返回一个cursor。便于我们遍历联系人。
紧接着的while循环就是遍历联系人。phoneNumber用于存取联系人电话便于等下些人sd卡。name用来存取联系人姓名,也是等会要写入sd卡的。
String name=cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME));
获得联系人的姓名。通过PhoneLookup.DISPLAY_NAME关键字。
由于同一个联系人可能有多个联系电话。所以我们接着获得了一个联系人电话的cursor。用来遍历联系人的每个电话。如下所示
while(phone.moveToNext()){
        phoneNumber=phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
       }
       String geshi=name+"\t\t\t"+phoneNumber+"\n";

二,将获得的联系人数据以txt格式写入sd卡
这里就涉及到文件的读写操作。
首先新建一个file对象 file=new File(folderName+filename);
并定义文件输出流 FileOutputStream fos=null;
并通过刚才新建的file对象实例化 fos=new FileOutputStream(file, true);
为了便于很格式的把联系人信息写入sd卡中的txt文本。我们定义String对象  String geshi=name+"\t\t\t"+phoneNumber+"\n";
然后就是写入数据了。fos.write(geshi.getBytes());
过程很简单吧        当然整个过程我是在新开辟的thread中完成。避免联系人过多阻塞ui线程。
好了就写这么多吧。新手第一次写教程。写的不好的地方请谅解。

testin平台确实做的很人性化。为开发者节省了大大的资金。也让自己的程序适配了更多的机型。
不足之处:适配速度慢。机型相对少。




你可能感兴趣的:(浏览器,服务器,应用)