- 浏览: 59714 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (218)
- ★★★ Android ★★★ (37)
- 【 Java 基础】✚ (0)
- ☞Java 基础概述 (0)
- ☞Java 基本语法 (0)
- ☞Java 面向对象编程 (0)
- ☞Java多线程 (0)
- ☞Java 异常处理 (0)
- ☞Java 集合框架 (0)
- ☞Java 泛型 (0)
- ☞Java 枚举和注解 (0)
- ☞Java IO流 (0)
- ☞Java 常用类 (0)
- ☞Java GUI键盘事件 (0)
- ☞Java 网络编程 (0)
- ☞Java 正则表达式 (0)
- ☞Java 反射机制 (0)
- ☞Java 小项目 (0)
- ☞Java 面试/笔试题 (0)
- 【HTML5 开发基础】✚ (0)
- ☞HTML常用标签 (0)
- ☞HTML 新特性 (0)
- ☞CSS/CSS3常用语法 (0)
- ☞JavaScript基础语法 (0)
- ☞HTML5 小项目 (0)
- ☞HTML5 面试/笔试题 (0)
- 【Android 基础阶段】✚ (12)
- ☞Android 快速入门 (1)
- ☞Android 核心组件 (1)
- ☞Android Intent (0)
- ☞Android 用户界面 (5)
- ☞Android 数据存储 (0)
- ☞Android Tomcat服务器 (0)
- ☞Android 网络编程 (2)
- ☞Android 消息机制 (0)
- ☞Android 事件机制 (0)
- ☞Fragment和ViewPager (3)
- ☞Android动画与图形处理 (0)
- ☞Android多媒体应用开发 (1)
- ☞Android 传感器开发等 (0)
- ☞Android GPS应用 (0)
- ☞Android C语言 (0)
- ☞Android JNI/NDK开发 (0)
- ☞Android Git/SVN (0)
- ☞Android 小项目 (0)
- ☞Android 面试/笔试题 (0)
- 【Android 微知识点】✚ (7)
- ☞Android 一些模版代码 (0)
- ☞Android 模块功能代码 (0)
- ☞Android UI控件大全 (2)
- ☞Android 自定义适配器 (1)
- ☞Android 自定义属性 (3)
- ☞Android 自定义动画 (0)
- ☞Android 启动过程 (0)
- ☞Android 性能优化 (0)
- ☞Android 图片三级缓存 (0)
- ☞Android 屏幕适配 (0)
- ☞Android OOM内存溢出 (0)
- ☞Android 权限 (0)
- ☞Android JNI (0)
- 【Android 网络编程】✚ (1)
- ☞Android Json解析 (2)
- ☞Android 网络请求 (2)
- 【Android 解析器】✚ (0)
- ☞Android XML (0)
- ☞Android DOM (0)
- ☞Android dom4j (0)
- ● (0)
- ●● (0)
- ●●● (0)
- ●●●● (0)
- ●●●●● (0)
- ●●●●●● (0)
- ●●●●●●● (0)
- ●●●●●●●● (0)
- ●●●●●●●●● (0)
- ☞☞☞☞☞☞☞☞☞☞ (0)
- ☞☞☞☞☞☞☞☞☞ (0)
- ☞☞☞☞☞☞☞☞ (0)
- ☞☞☞☞☞☞☞ (0)
- ☞☞☞☞☞☞ (0)
- ☞☞☞☞☞ (0)
- ☞☞☞☞ (0)
- ☞☞☞ (0)
- ☞☞ (0)
- ☞ (0)
- 【Android重量级框架】✚ (14)
- ☞框架归类 (1)
- ☞Gson (0)
- ☞xUtils3 (2)
- ☞xListView (0)
- ★ Volley (0)
- ★ AndroidAnnotations (0)
- ★ Glide (0)
- ★ SlidingMenu (0)
- ★ TabLayout (1)
- ★ ViewPagerIndicator (4)
- ★ Pulltorefresh (1)
- ★ PhotoView (1)
- ★ EventBus (0)
- ★ Vitamio5.0 (0)
- ★ Image-Loader (1)
- ★ Android-gif-drawable (0)
- ★ ActionBar (0)
- ★ ActionBarSherlock (0)
- ★ OkHttp (0)
- ★ Afinal (2)
- ★ Ffmpeg (0)
- ★ RxJava (0)
- ★ Picasso (0)
- ★ FastJson (0)
- ★ Toolbar (0)
- ★ GreenDao (0)
- ★ Otto (0)
- ★ ORMLite (0)
- ★ Retrofit (0)
- ★ Fresco (0)
- ★ SnappyDB (0)
- ★ Butterknife (0)
- ★ PagerSlidingTabStrip (0)
- PinterestLikeAdapterView (0)
- ★ NotBoringActionBar (0)
- ★ StickyListHeaders (0)
- ★ NineOldAndroids (0)
- ★ Expandablelistview (0)
- ★ SwipeRefreshLayout (0)
- ★ SwipeMenuListView (0)
- ★ (0)
- ★★ (0)
- ★★★ (0)
- ★★★★ (0)
- ★★★★★ (0)
- ★★★★★★ (0)
- ★★★★★★★ (0)
- ★★★★★★★★ (0)
- ★★★★★★★★★ (0)
- ★★★★★★★★★★ (0)
- ❉❉❉❉❉❉❉❉❉❉ (0)
- ❉❉❉❉❉❉❉❉❉ (0)
- ❉❉❉❉❉❉❉❉ (0)
- ❉❉❉❉❉❉❉ (0)
- ❉❉❉❉❉❉ (0)
- ❉❉❉❉❉ (0)
- ❉❉❉❉ (0)
- ❉❉❉ (0)
- ❉❉ (0)
- ❉ (0)
- 【第三方分享库】✚ (0)
- ○○○○○○○○○○ (0)
- ○○○○○○○○○ (0)
- ○○○○○○○○ (0)
- ○○○○○○○ (0)
- ○○○○○○ (0)
- ○○○○○ (0)
- ○○○○ (0)
- ○○○ (0)
- ○○ (0)
- ○ (1)
- 【Android开源项目】✚ (1)
- ☞综合性项目 (0)
- ☞多媒体项目 (1)
- ☞新闻性项目 (2)
- ☞社交性项目 (0)
- ☞商城性项目 (0)
- ☞Android 支付宝 (0)
- ☞Android 第三方登录 (0)
- ☞Android 语音识别 (0)
- ☞Android消息推送 (1)
- ☞Android 蓝牙 (0)
- ☞Android 传感器 (0)
- ☞Android 动画 (0)
- ☞Android 省市县三级联动 (0)
- ☞短信验证技术 (0)
- ☞二维码扫描技术 (0)
- ☂ (0)
- ☂☂ (0)
- ☂☂☂ (0)
- ☂☂☂☂ (0)
- ☂☂☂☂☂ (0)
- ☂☂☂☂☂☂ (0)
- ☂☂☂☂☂☂☂ (0)
- ☂☂☂☂☂☂☂☂ (0)
- ☂☂☂☂☂☂☂☂☂ (0)
- ☂☂☂☂☂☂☂☂☂☂ (0)
- ♣♣♣♣♣♣♣♣♣♣ (0)
- ♣♣♣♣♣♣♣♣♣ (0)
- ♣♣♣♣♣♣♣♣ (0)
- ♣♣♣♣♣♣♣ (0)
- ♣♣♣♣♣♣ (0)
- ♣♣♣♣♣ (0)
- ♣♣♣♣ (0)
- ♣♣♣ (0)
- ♣♣ (0)
- ♣ (0)
- 【Android源码分析】✚ (4)
- 【Android项目阶段】✚ (1)
- ☞Android主流架构搭建 (0)
- ☞综合性<手机安全卫士> (0)
- ☞多媒体<手机影音> (1)
- ☞新闻性<北京新闻> (0)
- ☞社交性<硅谷社交> (0)
- ☞商城性<硅谷商城> (0)
- ☞内涵段子<百思> (0)
- ☞<地图相关开发接口> (0)
- ☞下载<电子应用市场> (0)
- ☞智能<手机遥控家电> (0)
- ☞游戏<植物大战僵尸> (0)
- ☞企业实战<开源中国> (0)
- ☞Android5.0+6.0新特性 (0)
- ☞高级特效专辑 (0)
- ☞项目管理与实施 (0)
- ☞项目经验:面试/笔试题 (0)
- 【Android 前沿技术】✚ (0)
- ☞图文混排技术 (0)
- ☞百分比布局 (0)
- H5混合开发☞ (0)
- ☞APP增量升级 (0)
- ☞软件崩溃收集 (0)
- ☞前沿技术分享 (0)
- 【Android+H5混合开发】✚ (0)
- ☞React基本语法 (0)
- ☞React Native开发环境搭建 (0)
- ☞React Native开发基础 (0)
- ☞React Native常用组件 (0)
- ☞React Native常用API (0)
- ☞豆瓣搜索项目 (0)
- ☏ (0)
- ☏☏ (0)
- ☏☏☏ (0)
- ☏☏☏☏ (0)
- ☏☏☏☏☏ (0)
- ☏☏☏☏☏☏ (0)
- ☏☏☏☏☏☏☏ (0)
- ☏☏☏☏☏☏☏☏ (0)
- ☏☏☏☏☏☏☏☏☏ (0)
- ☏☏☏☏☏☏☏☏☏☏ (0)
- ☎☎☎☎☎☎☎☎☎☎ (0)
- ☎☎☎☎☎☎☎☎☎ (0)
- ☎☎☎☎☎☎☎☎ (0)
- ☎☎☎☎☎☎☎ (0)
- ☎☎☎☎☎☎ (0)
- ☎☎☎☎☎ (0)
- ☎☎☎ (0)
- ☎☎ (0)
- ☎ (0)
- 【Android+H5项目实战】✚ (0)
- 【程序员软件系列】✚ (4)
- ☞Eclipse (0)
- ☞Android Studio (4)
- ☞Genymotion (0)
- ☞Tomcat服务器 (0)
- ☞MyScal (0)
- ☀ (0)
- ☀☀ (0)
- ☀☀☀ (0)
- ☀☀☀☀ (0)
- ☀☀☀☀☀ (0)
- ☀☀☀☀☀☀ (0)
- ☀☀☀☀☀☀☀ (0)
- ☀☀☀☀☀☀☀☀ (0)
- ☀☀☀☀☀☀☀☀☀ (0)
- ☀☀☀☀☀☀☀☀☀☀ (0)
- ☻☻☻☻☻☻☻☻☻☻ (0)
- ☻☻☻☻☻☻☻☻☻ (0)
- ☻☻☻☻☻☻☻☻ (0)
- ☻☻☻☻☻☻☻ (0)
- ☻☻☻☻☻☻ (0)
- ☻☻☻☻☻ (0)
- ☻☻☻☻ (0)
- ☻☻☻ (0)
- ☻☻ (0)
- ☻ (0)
- ♬♬♬ 技术网站 ♬♬♬ (2)
- ◙ (0)
- ◙◙ (0)
- ◙◙◙ (0)
- ◙◙◙◙ (0)
- ◙◙◙◙◙ (0)
- ◘◘◘◘◘ (0)
- ◘◘◘◘ (0)
- ◘◘◘ (0)
- ◘◘ (0)
- ◘ (0)
- 【Android 其他技术】✚ (0)
- ☞Android反编译 (0)
- ☞抓包 (0)
- ☞多渠道打包及软件上线 (0)
- 【github项目/博客系列】✚ (1)
- ☞注册github步骤 (0)
- ☞github项目 (0)
- ☞优秀博客系列 (1)
- 【开发经验分享】✚ (2)
- ☞Android 知识体系 (1)
- ☞项目经验分享 (0)
- ☞面试与就业指导 (1)
- ☞Android面试技术汇总 (2)
- ♬♬♬ 词汇 ♬♬♬ (0)
- 【Android基础单词】✚ (0)
- 【javaSE单词】✚ (0)
- 【个人博客资料】✚ (0)
- 博客链接 (1)
- 快速开发 (1)
- JavaEE面试题 (1)
最新评论
android项目源码解析04:新浪微博客户端源码解析
1、项目概况
该项目文件列表如下:
其AndroidManifest.xml文件内容为:
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="cn.com.hh.view"
- android:versionCode="1"
- android:versionName="1.0">
- <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"
- android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
- <!--主Activity-->
- <activityandroid:name="cn.com.hh.view.MyBlogActivity"
- android:label="@string/app_name">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <!--注册授权登录Activity-->
- <activityandroid:name="cn.com.hh.view.AuthorizeActivity"android:launchMode="singleTask">
- <intent-filter>
- <actionandroid:name="android.intent.action.VIEW"/>
- <categoryandroid:name="android.intent.category.DEFAULT"/>
- <categoryandroid:name="android.intent.category.BROWSABLE"/>
- <dataandroid:scheme="myapp"android:host="AuthorizeActivity"/>
- </intent-filter>
- </activity>
- <!--注册登录Activity-->
- <activityandroid:name="cn.com.hh.view.LoginActivity">
- <!--<intent-filter>-->
- <!--<actionandroid:name="android.intent.action.VIEW"/>-->
- <!--<categoryandroid:name="android.intent.category.DEFAULT"/>-->
- <!--<categoryandroid:name="android.intent.category.BROWSABLE"/>-->
- <!--<dataandroid:scheme="myapp"android:host="AuthorizeActivity"/>-->
- <!--</intent-filter>-->
- </activity>
- <!--注册登录Activity-->
- <activityandroid:name="cn.com.hh.view.HomeActivity">
- </activity>
- <!--注册登录Activity-->
- <activityandroid:name="cn.com.hh.view.ViewActivity">
- </activity>
- </application>
- <uses-permissionandroid:name="android.permission.INTERNET"/>
- </manifest>
2、oauth2认证
说说关于OAuth授权认证的事情,新浪开放api都必须在这个基础上才能调用,所以有必要专门来讲讲,前面的文章中已经提到过关于新浪微博提供了OAuth和Base OAuth两种认证方式,并且本项目采用OAuth认证方式,至于为什么采用这个OAuth认证而不采用Base OAuth认证原因很简单,自从Twitter只支持OAuth认证方式以来,各大应用都纷纷转向OAuth认证方式,而新浪微博的开放平台也将在近日停止Base OAuth的认证方式。
OAuth的基本概念,OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。同样新浪微博提供OAuth认证也是为了保证用户账号和密码的安全,在这里通过OAuth建立普通新浪微博用户、客户端程序(我们正在开发的这个Android客户端程序)、新浪微博三者之间的相互信任关系,让客户端程序(我们正在开发的这个android客户端程序)不需要知道用户的账号和密码也能浏览、发布微博,这样有效的保护了用户账号的安全性不需要把账号密码透露给客户端程序又达到了通过客户端程序写微博看微博目的。这个是OAuth的作用。
结合新浪微博的OAuth认证来说说具体的功能实现,首先罗列一下关键字组,下面四组关键字跟我们接下来OAuth认证有非常大的关系。
第一组:(App Key和App Secret),这组参数就是本系列文本第一篇提到的建一个新的应用获取App Key和App Secret。
第二组:(Request Token和Request Secret)
第三组:(oauth_verifier)
第四组:(user_id、Access Token和Access Secret)
新浪微博的OAuth认证过程,当用户第一次使用本客户端软件时,客户端程序用第一组作为参数向新浪微博发起请求,然后新浪微博经过验证后返回第二组参数给客户端软件同时表示新浪微博信任本客户端软件,当客户端软件获取第二组参数时作为参数引导用户浏览器跳至新浪微博的授权页面,然后用户在新浪的这个授权页面里输入自己的微博账号和密码进行授权,完成授权后根据客户端设定的回调地址把第三组参数返回给客户端软件并表示用户也信任本客户端软件,接下客户端软件把第二组参数和第三组参数作为参数再次向新浪微博发起请求,然后新浪微博返回第四组参数给客户端软件,第四组参数需要好好的保存起来这个就是用来代替用户的新浪账号和密码用的,在后面调用api时都需要。从这个过程来看用户只是在新浪微博的认证网页输入过账户和密码并没有在客户端软件里输入过账户和密码,客户端软件只保存了第四组数据并没有保存用户的账户和密码,这样有效的避免了账户和密码透露给新浪微博之外的第三方应用程序,保证
了安全性。
本项目用为了方便开发采用了oauth-signpost开源项目进行OAuth认证开发,新建OAuth.java类文件对OA进行简单的封装,OAuth类主要有RequestAccessToken、GetAccessToken、SignRequest三个方法,第一个方法RequestAccessToken就是上面过程中用来获取第三组参数用的,GetAccessToken方法是用来获取第四组参数用,SignRequest方法是用来调用api用。由于采用了oauth-signpost开源项目简单了很多。具体代码如下:
- publicclassOAuth{
- privateCommonsHttpOAuthConsumerhttpOauthConsumer;
- privateOAuthProviderhttpOauthprovider;
- publicStringconsumerKey;
- publicStringconsumerSecret;
- publicOAuth()
- {
- //第一组:(AppKey和AppSecret)
- //这组参数就是本系列文本第一篇提到的建一个新的应用获取AppKey和AppSecret。
- this("3315495489","e2731e7grf592c0fd7fea32406f86e1b");
- }
- publicOAuth(StringconsumerKey,StringconsumerSecret)
- {
- this.consumerKey=consumerKey;
- this.consumerSecret=consumerSecret;
- }
- publicBooleanRequestAccessToken(Activityactivity,StringcallBackUrl){
- Booleanret=false;
- try{
- httpOauthConsumer=newCommonsHttpOAuthConsumer(consumerKey,consumerSecret);
- httpOauthprovider=newDefaultOAuthProvider("http://api.t.sina.com.cn/oauth/request_token","http://api.t.sina.com.cn/oauth/access_token","http://api.t.sina.com.cn/oauth/authorize");
- StringauthUrl=httpOauthprovider.retrieveRequestToken(httpOauthConsumer,callBackUrl);
- activity.startActivity(newIntent(Intent.ACTION_VIEW,Uri.parse(authUrl)));
- ret=true;
- }catch(Exceptione){
- }
- returnret;
- }
- publicUserInfoGetAccessToken(Intentintent){
- UserInfouser=null;
- Uriuri=intent.getData();
- Stringverifier=uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);
- try{
- httpOauthprovider.setOAuth10a(true);
- httpOauthprovider.retrieveAccessToken(httpOauthConsumer,verifier);
- }catch(OAuthMessageSignerExceptionex){
- ex.printStackTrace();
- }catch(OAuthNotAuthorizedExceptionex){
- ex.printStackTrace();
- }catch(OAuthExpectationFailedExceptionex){
- ex.printStackTrace();
- }catch(OAuthCommunicationExceptionex){
- ex.printStackTrace();
- }
- SortedSet<String>user_id=httpOauthprovider.getResponseParameters().get("user_id");
- StringuserId=user_id.first();
- StringuserKey=httpOauthConsumer.getToken();
- StringuserSecret=httpOauthConsumer.getTokenSecret();
- user=newUserInfo();
- user.setUserId(userId);
- user.setToken(userKey);
- user.setTokenSecret(userSecret);
- returnuser;
- }
- publicHttpResponseSignRequest(Stringtoken,StringtokenSecret,Stringurl,Listparams)
- {
- HttpPostpost=newHttpPost(url);
- //HttpClienthttpClient=null;
- try{
- post.setEntity(newUrlEncodedFormEntity(params,HTTP.UTF_8));
- }catch(UnsupportedEncodingExceptione){
- e.printStackTrace();
- }
- //关闭Expect:100-Continue握手
- //100-Continue握手需谨慎使用,因为遇到不支持HTTP/1.1协议的服务器或者代理时会引起问题
- post.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE,false);
- returnSignRequest(token,tokenSecret,post);
- }
- publicHttpResponseSignRequest(Stringtoken,StringtokenSecret,HttpPostpost){
- httpOauthConsumer=newCommonsHttpOAuthConsumer(consumerKey,consumerSecret);
- httpOauthConsumer.setTokenWithSecret(token,tokenSecret);
- HttpResponseresponse=null;
- try{
- httpOauthConsumer.sign(post);
- }catch(OAuthMessageSignerExceptione){
- e.printStackTrace();
- }catch(OAuthExpectationFailedExceptione){
- e.printStackTrace();
- }catch(OAuthCommunicationExceptione){
- e.printStackTrace();
- }
- //取得HTTPresponse
- try{
- response=newDefaultHttpClient().execute(post);
- }catch(ClientProtocolExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- returnresponse;
- }
- }
根据上文的介绍,我们知道,需要获得用户的授权才可以获得对该用户新浪微博的操作权限,在项目中对此是这样处理的。其界面如下:
用户进入应用以后,会转到是否对新浪微博进行授权界面,点击“开始”后启动浏览器进入新浪微博授权界面,该界面是新浪制作的,与本应用无关。用户输入账号和密码以后,点击“授权”,进行授权操作。该界面源码如下:
- publicclassAuthorizeActivityextendsActivity{
- privateDialogdialog;
- privateOAuthauth;
- privatestaticfinalStringCallBackUrl="myapp://AuthorizeActivity";
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.authorize);
- ViewdiaView=View.inflate(this,R.layout.dialog,null);
- dialog=newDialog(AuthorizeActivity.this,R.style.dialog);
- dialog.setContentView(diaView);
- dialog.show();
- ImageButtonstratBtn=(ImageButton)diaView.findViewById(R.id.btn_start);
- stratBtn.setOnClickListener(newOnClickListener(){
- publicvoidonClick(Viewarg0){
- auth=newOAuth("30632531","f539cb169860ed99cf8c1861c5da34f6");
- auth.RequestAccessToken(AuthorizeActivity.this,CallBackUrl);
- }
- });
- }
- @Override
- protectedvoidonNewIntent(Intentintent){
- super.onNewIntent(intent);
- //在这里处理获取返回的oauth_verifier参数
- UserInfouser=auth.GetAccessToken(intent);
- if(user!=null){
- DataHelperhelper=newDataHelper(this);
- Stringuid=user.getUserId();
- if(helper.HaveUserInfo(uid))
- {
- helper.UpdateUserInfo(user);
- Log.e("UserInfo","update");
- }else
- {
- helper.SaveUserInfo(user);
- Log.e("UserInfo","add");
- }
- }
- }
- }
这里有个地方需要注意,授权成功后重新进入AuthorizeActivity界面,执行onNewIntent函数后并不会自动跳转到其他界面。这里需要添加新的跳转代码。
3、onNewIntent调用时机
这一部分介绍一下onNewIntent的调用时机。
在IntentActivity中重写下列方法:onCreate onStart onRestart onResume onPause onStop onDestroy onNewIntent
3.1、其他应用发Intent,执行下列方法:
I/@@@philn(12410): onCreate
I/@@@philn(12410): onStart
I/@@@philn(12410): onResume
发Intent的方法:
Uri uri = Uri.parse("philn://blog.163.com");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
3.2、接收Intent声明:
- <activityandroid:name="cn.com.hh.view.AuthorizeActivity"android:launchMode="singleTask">
- <intent-filter>
- <actionandroid:name="android.intent.action.VIEW"/>
- <categoryandroid:name="android.intent.category.DEFAULT"/>
- <categoryandroid:name="android.intent.category.BROWSABLE"/>
- <dataandroid:scheme="myapp"android:host="AuthorizeActivity"/>
- </intent-filter>
- </activity>
I/@@@philn(12410): onPause
I/@@@philn(12410): onStop 状态的话
其他应用再发送Intent的话,执行顺序为:
I/@@@philn(12410): onNewIntent
I/@@@philn(12410): onRestart
I/@@@philn(12410): onStart
I/@@@philn(12410): onResume
在Android应用程序开发的时候,从一个Activity启动另一个Activity并传递一些数据到新的Activity上非常简单,但是当您需要让后台运行的Activity回到前台并传递一些数据可能就会存在一点点小问题。
首先,在默认情况下,当您通过Intent启到一个Activity的时候,就算已经存在一个相同的正在运行的Activity,系统都会创建一个新的Activity实例并显示出来。为了不让Activity实例化多次,我们需要通过在AndroidManifest.xml配置activity的加载方式(launchMode)以实现单任务模式,如下所示:
- <activityandroid:label="@string/app_name"android:launchmode="singleTask"android:name="Activity1">
- </activity>
- protectedvoidonNewIntent(Intentintent){
- super.onNewIntent(intent);
- setIntent(intent);//muststorethenewintentunlessgetIntent()willreturntheoldone
- processExtraData();
- }
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- processExtraData();
- }
- protectedvoidonNewIntent(Intentintent){
- super.onNewIntent(intent);
- setIntent(intent);//muststorethenewintentunlessgetIntent()willreturntheoldone
- processExtraData()
- }
- privatevoidprocessExtraData(){
- Intentintent=getIntent();
- //usethedatareceivedhere
- }
4、获得微博数据
获得用户认证后,就可以获得第四组参数,就可以依次获得用户数据了。
在项目中这一步是在HomeActivity界面中完成的,其中获得微博数据部分函数的源码如下:
- privatevoidloadList(){
- if(ConfigHelper.nowUser==null)
- {
- }
- else
- {
- user=ConfigHelper.nowUser;
- //显示当前用户名称
- TextViewshowName=(TextView)findViewById(R.id.showName);
- showName.setText(user.getUserName());
- OAuthauth=newOAuth();
- Stringurl="http://api.t.sina.com.cn/statuses/friends_timeline.json";
- //Stringurl="http://api.t.sina.com.cn/statuses/public_timeline.json";
- List<BasicNameValuePair>params=newArrayList<BasicNameValuePair>();
- params.add(newBasicNameValuePair("source",auth.consumerKey));
- HttpResponseresponse=auth.SignRequest(user.getToken(),user.getTokenSecret(),url,params);
- if(200==response.getStatusLine().getStatusCode()){
- try{
- InputStreamis=response.getEntity().getContent();
- Readerreader=newBufferedReader(newInputStreamReader(is),4000);
- StringBuilderbuffer=newStringBuilder((int)response.getEntity().getContentLength());
- try{
- char[]tmp=newchar[1024];
- intl;
- while((l=reader.read(tmp))!=-1){
- buffer.append(tmp,0,l);
- }
- }finally{
- reader.close();
- }
- Stringstring=buffer.toString();
- //Log.e("json","rs:"+string);
- ((org.apache.http.HttpResponse)response).getEntity().consumeContent();
- JSONArraydata=newJSONArray(string);
- for(inti=0;i<data.length();i++)
- {
- JSONObjectd=data.getJSONObject(i);
- //Log.e("json","rs:"+d.getString("created_at"));
- if(d!=null){
- JSONObjectu=d.getJSONObject("user");
- if(d.has("retweeted_status")){
- JSONObjectr=d.getJSONObject("retweeted_status");
- }
- //微博id
- Stringid=d.getString("id");
- StringuserId=u.getString("id");
- StringuserName=u.getString("screen_name");
- StringuserIcon=u.getString("profile_image_url");
- //Log.e("userIcon",userIcon);
- Stringtime=d.getString("created_at");
- Stringtext=d.getString("text");
- BooleanhaveImg=false;
- if(d.has("thumbnail_pic")){
- haveImg=true;
- //Stringthumbnail_pic=d.getString("thumbnail_pic");
- //Log.e("thumbnail_pic",thumbnail_pic);
- }
- DatestartDate=newDate(time);
- DatenowDate=Calendar.getInstance().getTime();
- time=newDateUtilsDef().twoDateDistance(startDate,nowDate);
- if(wbList==null){
- wbList=newArrayList<WeiBoInfo>();
- }
- WeiBoInfow=newWeiBoInfo();
- w.setId(id);
- w.setUserId(userId);
- w.setUserName(userName);
- w.setTime(time+"前");
- w.setText(text);
- w.setHaveImage(haveImg);
- w.setUserIcon(userIcon);
- wbList.add(w);
- }
- }
- }catch(IllegalStateExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }catch(JSONExceptione){
- e.printStackTrace();
- }
- }
- if(wbList!=null)
- {
- WeiBoAdapateradapater=newWeiBoAdapater();
- ListViewMsglist=(ListView)findViewById(R.id.Msglist);
- Msglist.setOnItemClickListener(newOnItemClickListener(){
- publicvoidonItemClick(AdapterView<?>arg0,Viewview,intarg2,longarg3){
- Objectobj=view.getTag();
- if(obj!=null){
- Stringid=obj.toString();
- Intentintent=newIntent(HomeActivity.this,ViewActivity.class);
- Bundleb=newBundle();
- b.putString("key",id);
- intent.putExtras(b);
- startActivity(intent);
- }
- }
- });
- Msglist.setAdapter(adapater);
- }
- }
- loadingLayout.setVisibility(View.GONE);
- }
参考文献:
http://www.cnblogs.com/hll2008/archive/2011/01/03/1923674.html
相关推荐
本篇文章将详细探讨“android应用源码(精)新浪微博客户端源码”,帮助你了解Android应用的设计模式、架构以及功能实现。 首先,我们需要理解的是Android应用程序的基本结构,它通常由多个组件(Activity、Service、...
【标题】:“android应用源码(精)新浪微博客户端源码” 涉及的知识点主要集中在Android应用开发和微博客户端的实现上。Android是Google公司推出的一种基于Linux内核的开源移动操作系统,广泛用于智能手机和平板电脑...
"安卓开发-Android应用源码四次元新浪微博客户端项目.zip" 这个标题揭示了我们要探讨的主题是关于安卓应用的开发,具体是一个实现新浪微博客户端的应用程序源码。四次元可能指的是该项目的独特设计或者开发者的一个...
本篇文章将聚焦于"android应用源码(精)新浪微博客户端源码"这一主题,带领读者深入了解Android应用程序的设计理念和实现细节。 1. **项目结构** 新浪微博客户端源码通常遵循MVP(Model-View-Presenter)或MVVM...
在Android平台上开发新浪微博客户端是一项常见的任务,涉及到许多关键的技术点和流程。本资源提供了一个完整的开发攻略和源码,帮助开发者深入理解并实践这一过程。以下是对这些知识点的详细阐述: 1. **Android ...
《Android新浪微博客户端源码解析与学习指南》 在移动互联网时代,社交网络成为了人们日常生活中不可或缺的一部分,其中,新浪微博作为国内领先的社交媒体平台,其客户端应用的开发技术也备受开发者关注。本文将...
【标题】"安卓Android源码——(精)新浪微博客户端源码.zip" 提供的是一个针对安卓平台的Android源码,具体是新浪微博的客户端应用。这个压缩包内容包含了该客户端应用程序的源代码,对于想要深入理解Android应用开发...
"新浪微博客户端源码" 是一个关于Android平台的应用程序开发的学习资源,它提供了新浪微博官方客户端的源代码,让开发者能够深入理解并学习如何构建类似的应用。这个源码可以帮助开发者研究微博应用的架构设计、功能...
本文将围绕“Android源码——新浪微博客户端源码”这一主题,展开对Android微博客户端源码的深度解析。 首先,从标题和描述来看,我们可以推测这是一份关于Android平台上的新浪微博客户端的开源代码。这份源码可能...
通过对“Android应用源码(精)新浪微博客户端源码”的深入解析,开发者可以学习到实际项目中的最佳实践,理解并掌握Android开发的核心技术和设计理念,从而提升自己的专业技能。在实践中不断探索和学习,才能在这个...
在Android平台上,开发一款仿新浪微博客户端是一项挑战性的任务,它涉及到多个关键的技术点,包括UI设计、网络请求、数据解析、缓存策略、用户登录授权、动态加载与刷新、社交功能实现等。以下是对这个项目中涉及的...
《安卓Android源码——四次元新浪微博客户端项目》 这个项目是针对安卓平台的一个开源实现,旨在解析并展示了新浪微博客户端的源代码。源码分析对于开发者来说是宝贵的资源,能够帮助我们深入理解移动应用的开发...
【标签】:“andoid新浪微博客户端源代码”、“android”、“java”、“新浪微博客户端” 本文将深入探讨基于Android的新浪微博客户端源代码,主要涉及以下几个关键知识点: 1. **Android开发基础**:Android是...
本篇将聚焦于“Android源码——新浪微博客户端源码”,通过深度解析这个开源项目,我们不仅可以学习到Android应用开发的基本框架,还能探索微博客户端的具体实现细节。 首先,我们要明确的是,Android源码分析通常...
【Android 新浪微博客户端源码2.zip】是一个包含Android应用项目的源码,主要目标是提供一个参考和学习的平台,帮助开发者了解如何构建一个类似新浪微博的客户端应用。这个项目使用了Java编程语言,这是Android平台...
《深入剖析:微博客户端源码解析》 在Android开发领域,源码学习是提升技能、理解框架工作原理的重要途径。本篇文章将围绕“应用源码(精)新浪微博客户端源码”这一主题,深入探讨其中涉及的技术点,为你的毕业设计...