`
苗振忠
  • 浏览: 59714 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

android项目源码解析04:新浪微博客户端源码解析

 
阅读更多
本文主要介绍如何构建新浪微博客户端。以网上流传weiboSina源码为例介绍,其下载地址为:http://download.csdn.net/detail/ryzhanglu/3453875

1、项目概况

该项目文件列表如下:


其AndroidManifest.xml文件内容为:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3. package="cn.com.hh.view"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"
  7. android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
  8. <!--主Activity-->
  9. <activityandroid:name="cn.com.hh.view.MyBlogActivity"
  10. android:label="@string/app_name">
  11. <intent-filter>
  12. <actionandroid:name="android.intent.action.MAIN"/>
  13. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  14. </intent-filter>
  15. </activity>
  16. <!--注册授权登录Activity-->
  17. <activityandroid:name="cn.com.hh.view.AuthorizeActivity"android:launchMode="singleTask">
  18. <intent-filter>
  19. <actionandroid:name="android.intent.action.VIEW"/>
  20. <categoryandroid:name="android.intent.category.DEFAULT"/>
  21. <categoryandroid:name="android.intent.category.BROWSABLE"/>
  22. <dataandroid:scheme="myapp"android:host="AuthorizeActivity"/>
  23. </intent-filter>
  24. </activity>
  25. <!--注册登录Activity-->
  26. <activityandroid:name="cn.com.hh.view.LoginActivity">
  27. <!--<intent-filter>-->
  28. <!--<actionandroid:name="android.intent.action.VIEW"/>-->
  29. <!--<categoryandroid:name="android.intent.category.DEFAULT"/>-->
  30. <!--<categoryandroid:name="android.intent.category.BROWSABLE"/>-->
  31. <!--<dataandroid:scheme="myapp"android:host="AuthorizeActivity"/>-->
  32. <!--</intent-filter>-->
  33. </activity>
  34. <!--注册登录Activity-->
  35. <activityandroid:name="cn.com.hh.view.HomeActivity">
  36. </activity>
  37. <!--注册登录Activity-->
  38. <activityandroid:name="cn.com.hh.view.ViewActivity">
  39. </activity>
  40. </application>
  41. <uses-permissionandroid:name="android.permission.INTERNET"/>
  42. </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开源项目简单了很多。具体代码如下:

  1. publicclassOAuth{
  2. privateCommonsHttpOAuthConsumerhttpOauthConsumer;
  3. privateOAuthProviderhttpOauthprovider;
  4. publicStringconsumerKey;
  5. publicStringconsumerSecret;
  6. publicOAuth()
  7. {
  8. //第一组:(AppKey和AppSecret)
  9. //这组参数就是本系列文本第一篇提到的建一个新的应用获取AppKey和AppSecret。
  10. this("3315495489","e2731e7grf592c0fd7fea32406f86e1b");
  11. }
  12. publicOAuth(StringconsumerKey,StringconsumerSecret)
  13. {
  14. this.consumerKey=consumerKey;
  15. this.consumerSecret=consumerSecret;
  16. }
  17. publicBooleanRequestAccessToken(Activityactivity,StringcallBackUrl){
  18. Booleanret=false;
  19. try{
  20. httpOauthConsumer=newCommonsHttpOAuthConsumer(consumerKey,consumerSecret);
  21. 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");
  22. StringauthUrl=httpOauthprovider.retrieveRequestToken(httpOauthConsumer,callBackUrl);
  23. activity.startActivity(newIntent(Intent.ACTION_VIEW,Uri.parse(authUrl)));
  24. ret=true;
  25. }catch(Exceptione){
  26. }
  27. returnret;
  28. }
  29. publicUserInfoGetAccessToken(Intentintent){
  30. UserInfouser=null;
  31. Uriuri=intent.getData();
  32. Stringverifier=uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);
  33. try{
  34. httpOauthprovider.setOAuth10a(true);
  35. httpOauthprovider.retrieveAccessToken(httpOauthConsumer,verifier);
  36. }catch(OAuthMessageSignerExceptionex){
  37. ex.printStackTrace();
  38. }catch(OAuthNotAuthorizedExceptionex){
  39. ex.printStackTrace();
  40. }catch(OAuthExpectationFailedExceptionex){
  41. ex.printStackTrace();
  42. }catch(OAuthCommunicationExceptionex){
  43. ex.printStackTrace();
  44. }
  45. SortedSet<String>user_id=httpOauthprovider.getResponseParameters().get("user_id");
  46. StringuserId=user_id.first();
  47. StringuserKey=httpOauthConsumer.getToken();
  48. StringuserSecret=httpOauthConsumer.getTokenSecret();
  49. user=newUserInfo();
  50. user.setUserId(userId);
  51. user.setToken(userKey);
  52. user.setTokenSecret(userSecret);
  53. returnuser;
  54. }
  55. publicHttpResponseSignRequest(Stringtoken,StringtokenSecret,Stringurl,Listparams)
  56. {
  57. HttpPostpost=newHttpPost(url);
  58. //HttpClienthttpClient=null;
  59. try{
  60. post.setEntity(newUrlEncodedFormEntity(params,HTTP.UTF_8));
  61. }catch(UnsupportedEncodingExceptione){
  62. e.printStackTrace();
  63. }
  64. //关闭Expect:100-Continue握手
  65. //100-Continue握手需谨慎使用,因为遇到不支持HTTP/1.1协议的服务器或者代理时会引起问题
  66. post.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE,false);
  67. returnSignRequest(token,tokenSecret,post);
  68. }
  69. publicHttpResponseSignRequest(Stringtoken,StringtokenSecret,HttpPostpost){
  70. httpOauthConsumer=newCommonsHttpOAuthConsumer(consumerKey,consumerSecret);
  71. httpOauthConsumer.setTokenWithSecret(token,tokenSecret);
  72. HttpResponseresponse=null;
  73. try{
  74. httpOauthConsumer.sign(post);
  75. }catch(OAuthMessageSignerExceptione){
  76. e.printStackTrace();
  77. }catch(OAuthExpectationFailedExceptione){
  78. e.printStackTrace();
  79. }catch(OAuthCommunicationExceptione){
  80. e.printStackTrace();
  81. }
  82. //取得HTTPresponse
  83. try{
  84. response=newDefaultHttpClient().execute(post);
  85. }catch(ClientProtocolExceptione){
  86. e.printStackTrace();
  87. }catch(IOExceptione){
  88. e.printStackTrace();
  89. }
  90. returnresponse;
  91. }
  92. }
2、认证界面

根据上文的介绍,我们知道,需要获得用户的授权才可以获得对该用户新浪微博的操作权限,在项目中对此是这样处理的。其界面如下:

用户进入应用以后,会转到是否对新浪微博进行授权界面,点击“开始”后启动浏览器进入新浪微博授权界面,该界面是新浪制作的,与本应用无关。用户输入账号和密码以后,点击“授权”,进行授权操作。该界面源码如下:

  1. publicclassAuthorizeActivityextendsActivity{
  2. privateDialogdialog;
  3. privateOAuthauth;
  4. privatestaticfinalStringCallBackUrl="myapp://AuthorizeActivity";
  5. @Override
  6. protectedvoidonCreate(BundlesavedInstanceState){
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.authorize);
  9. ViewdiaView=View.inflate(this,R.layout.dialog,null);
  10. dialog=newDialog(AuthorizeActivity.this,R.style.dialog);
  11. dialog.setContentView(diaView);
  12. dialog.show();
  13. ImageButtonstratBtn=(ImageButton)diaView.findViewById(R.id.btn_start);
  14. stratBtn.setOnClickListener(newOnClickListener(){
  15. publicvoidonClick(Viewarg0){
  16. auth=newOAuth("30632531","f539cb169860ed99cf8c1861c5da34f6");
  17. auth.RequestAccessToken(AuthorizeActivity.this,CallBackUrl);
  18. }
  19. });
  20. }
  21. @Override
  22. protectedvoidonNewIntent(Intentintent){
  23. super.onNewIntent(intent);
  24. //在这里处理获取返回的oauth_verifier参数
  25. UserInfouser=auth.GetAccessToken(intent);
  26. if(user!=null){
  27. DataHelperhelper=newDataHelper(this);
  28. Stringuid=user.getUserId();
  29. if(helper.HaveUserInfo(uid))
  30. {
  31. helper.UpdateUserInfo(user);
  32. Log.e("UserInfo","update");
  33. }else
  34. {
  35. helper.SaveUserInfo(user);
  36. Log.e("UserInfo","add");
  37. }
  38. }
  39. }
  40. }
从该源码中我们可以发现,在AuthorizeActivity界面,用户点击“授权”以后,又重新进入AuthorizeActivity界面(这一步与AndroidManifest.xml文件中AuthorizeActivity项的配置有关),此时会调用onNewIntent接口。

这里有个地方需要注意,授权成功后重新进入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声明:

  1. <activityandroid:name="cn.com.hh.view.AuthorizeActivity"android:launchMode="singleTask">
  2. <intent-filter>
  3. <actionandroid:name="android.intent.action.VIEW"/>
  4. <categoryandroid:name="android.intent.category.DEFAULT"/>
  5. <categoryandroid:name="android.intent.category.BROWSABLE"/>
  6. <dataandroid:scheme="myapp"android:host="AuthorizeActivity"/>
  7. </intent-filter>
  8. </activity>
3.3、如果IntentActivity处于任务栈的顶端(AndroidManifest.xml配置中的android:launchMode="singleTask" 项),也就是说之前打开过的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)以实现单任务模式,如下所示:
  1. <activityandroid:label="@string/app_name"android:launchmode="singleTask"android:name="Activity1">
  2. </activity>
launchMode为singleTask的时候,通过Intent启到一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候,系统就不会再调用通常情况下我们处理请求数据的onCreate方法,而是调用onNewIntent方法,如下所示:
  1. protectedvoidonNewIntent(Intentintent){
  2. super.onNewIntent(intent);
  3. setIntent(intent);//muststorethenewintentunlessgetIntent()willreturntheoldone
  4. processExtraData();
  5. }
不要忘记,系统可能会随时杀掉后台运行的Activity,如果这一切发生,那么系统就会调用onCreate方法,而不调用onNewIntent方法,一个好的解决方法就是在onCreate和onNewIntent方法中调用同一个处理数据的方法,如下所示:
  1. publicvoidonCreate(BundlesavedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.main);
  4. processExtraData();
  5. }
  6. protectedvoidonNewIntent(Intentintent){
  7. super.onNewIntent(intent);
  8. setIntent(intent);//muststorethenewintentunlessgetIntent()willreturntheoldone
  9. processExtraData()
  10. }
  11. privatevoidprocessExtraData(){
  12. Intentintent=getIntent();
  13. //usethedatareceivedhere
  14. }

4、获得微博数据

获得用户认证后,就可以获得第四组参数,就可以依次获得用户数据了。

在项目中这一步是在HomeActivity界面中完成的,其中获得微博数据部分函数的源码如下:

  1. privatevoidloadList(){
  2. if(ConfigHelper.nowUser==null)
  3. {
  4. }
  5. else
  6. {
  7. user=ConfigHelper.nowUser;
  8. //显示当前用户名称
  9. TextViewshowName=(TextView)findViewById(R.id.showName);
  10. showName.setText(user.getUserName());
  11. OAuthauth=newOAuth();
  12. Stringurl="http://api.t.sina.com.cn/statuses/friends_timeline.json";
  13. //Stringurl="http://api.t.sina.com.cn/statuses/public_timeline.json";
  14. List<BasicNameValuePair>params=newArrayList<BasicNameValuePair>();
  15. params.add(newBasicNameValuePair("source",auth.consumerKey));
  16. HttpResponseresponse=auth.SignRequest(user.getToken(),user.getTokenSecret(),url,params);
  17. if(200==response.getStatusLine().getStatusCode()){
  18. try{
  19. InputStreamis=response.getEntity().getContent();
  20. Readerreader=newBufferedReader(newInputStreamReader(is),4000);
  21. StringBuilderbuffer=newStringBuilder((int)response.getEntity().getContentLength());
  22. try{
  23. char[]tmp=newchar[1024];
  24. intl;
  25. while((l=reader.read(tmp))!=-1){
  26. buffer.append(tmp,0,l);
  27. }
  28. }finally{
  29. reader.close();
  30. }
  31. Stringstring=buffer.toString();
  32. //Log.e("json","rs:"+string);
  33. ((org.apache.http.HttpResponse)response).getEntity().consumeContent();
  34. JSONArraydata=newJSONArray(string);
  35. for(inti=0;i<data.length();i++)
  36. {
  37. JSONObjectd=data.getJSONObject(i);
  38. //Log.e("json","rs:"+d.getString("created_at"));
  39. if(d!=null){
  40. JSONObjectu=d.getJSONObject("user");
  41. if(d.has("retweeted_status")){
  42. JSONObjectr=d.getJSONObject("retweeted_status");
  43. }
  44. //微博id
  45. Stringid=d.getString("id");
  46. StringuserId=u.getString("id");
  47. StringuserName=u.getString("screen_name");
  48. StringuserIcon=u.getString("profile_image_url");
  49. //Log.e("userIcon",userIcon);
  50. Stringtime=d.getString("created_at");
  51. Stringtext=d.getString("text");
  52. BooleanhaveImg=false;
  53. if(d.has("thumbnail_pic")){
  54. haveImg=true;
  55. //Stringthumbnail_pic=d.getString("thumbnail_pic");
  56. //Log.e("thumbnail_pic",thumbnail_pic);
  57. }
  58. DatestartDate=newDate(time);
  59. DatenowDate=Calendar.getInstance().getTime();
  60. time=newDateUtilsDef().twoDateDistance(startDate,nowDate);
  61. if(wbList==null){
  62. wbList=newArrayList<WeiBoInfo>();
  63. }
  64. WeiBoInfow=newWeiBoInfo();
  65. w.setId(id);
  66. w.setUserId(userId);
  67. w.setUserName(userName);
  68. w.setTime(time+"前");
  69. w.setText(text);
  70. w.setHaveImage(haveImg);
  71. w.setUserIcon(userIcon);
  72. wbList.add(w);
  73. }
  74. }
  75. }catch(IllegalStateExceptione){
  76. e.printStackTrace();
  77. }catch(IOExceptione){
  78. e.printStackTrace();
  79. }catch(JSONExceptione){
  80. e.printStackTrace();
  81. }
  82. }
  83. if(wbList!=null)
  84. {
  85. WeiBoAdapateradapater=newWeiBoAdapater();
  86. ListViewMsglist=(ListView)findViewById(R.id.Msglist);
  87. Msglist.setOnItemClickListener(newOnItemClickListener(){
  88. publicvoidonItemClick(AdapterView<?>arg0,Viewview,intarg2,longarg3){
  89. Objectobj=view.getTag();
  90. if(obj!=null){
  91. Stringid=obj.toString();
  92. Intentintent=newIntent(HomeActivity.this,ViewActivity.class);
  93. Bundleb=newBundle();
  94. b.putString("key",id);
  95. intent.putExtras(b);
  96. startActivity(intent);
  97. }
  98. }
  99. });
  100. Msglist.setAdapter(adapater);
  101. }
  102. }
  103. loadingLayout.setVisibility(View.GONE);
  104. }
其中根据新浪提供的API对用户数据进行操作。这里只是获得用户所发布的微博信息,其api为http://api.t.sina.com.cn/statuses/friends_timeline.json。这里同时需要提供第四组参数,params.add(new BasicNameValuePair("source", auth.consumerKey));。其返回的数据格式是json需要对其进行解析。对于json格式的解析可以参看本人博文《android基础知识11:json解析及简单例子》。


参考文献:

http://www.cnblogs.com/hll2008/archive/2011/01/03/1923674.html

及其系列文章
分享到:
评论

相关推荐

    android应用源码(精)新浪微博客户端源码.zip

    本篇文章将详细探讨“android应用源码(精)新浪微博客户端源码”,帮助你了解Android应用的设计模式、架构以及功能实现。 首先,我们需要理解的是Android应用程序的基本结构,它通常由多个组件(Activity、Service、...

    android应用源码(精)新浪微博客户端源码

    【标题】:“android应用源码(精)新浪微博客户端源码” 涉及的知识点主要集中在Android应用开发和微博客户端的实现上。Android是Google公司推出的一种基于Linux内核的开源移动操作系统,广泛用于智能手机和平板电脑...

    安卓开发-Android应用源码四次元新浪微博客户端项目.zip

    "安卓开发-Android应用源码四次元新浪微博客户端项目.zip" 这个标题揭示了我们要探讨的主题是关于安卓应用的开发,具体是一个实现新浪微博客户端的应用程序源码。四次元可能指的是该项目的独特设计或者开发者的一个...

    android应用源码(精)新浪微博客户端源码.rar

    本篇文章将聚焦于"android应用源码(精)新浪微博客户端源码"这一主题,带领读者深入了解Android应用程序的设计理念和实现细节。 1. **项目结构** 新浪微博客户端源码通常遵循MVP(Model-View-Presenter)或MVVM...

    android开发新浪微博客户端+完整攻略+源码

    在Android平台上开发新浪微博客户端是一项常见的任务,涉及到许多关键的技术点和流程。本资源提供了一个完整的开发攻略和源码,帮助开发者深入理解并实践这一过程。以下是对这些知识点的详细阐述: 1. **Android ...

    android新浪微博客户端源码

    《Android新浪微博客户端源码解析与学习指南》 在移动互联网时代,社交网络成为了人们日常生活中不可或缺的一部分,其中,新浪微博作为国内领先的社交媒体平台,其客户端应用的开发技术也备受开发者关注。本文将...

    安卓Android源码——(精)新浪微博客户端源码.zip

    【标题】"安卓Android源码——(精)新浪微博客户端源码.zip" 提供的是一个针对安卓平台的Android源码,具体是新浪微博的客户端应用。这个压缩包内容包含了该客户端应用程序的源代码,对于想要深入理解Android应用开发...

    新浪微博客户端源码

    "新浪微博客户端源码" 是一个关于Android平台的应用程序开发的学习资源,它提供了新浪微博官方客户端的源代码,让开发者能够深入理解并学习如何构建类似的应用。这个源码可以帮助开发者研究微博应用的架构设计、功能...

    Android源码——新浪微博客户端源码.7z

    本文将围绕“Android源码——新浪微博客户端源码”这一主题,展开对Android微博客户端源码的深度解析。 首先,从标题和描述来看,我们可以推测这是一份关于Android平台上的新浪微博客户端的开源代码。这份源码可能...

    android应用源码精新浪微博客户端源码.zip

    通过对“Android应用源码(精)新浪微博客户端源码”的深入解析,开发者可以学习到实际项目中的最佳实践,理解并掌握Android开发的核心技术和设计理念,从而提升自己的专业技能。在实践中不断探索和学习,才能在这个...

    Android仿新浪微博客户端源代码

    在Android平台上,开发一款仿新浪微博客户端是一项挑战性的任务,它涉及到多个关键的技术点,包括UI设计、网络请求、数据解析、缓存策略、用户登录授权、动态加载与刷新、社交功能实现等。以下是对这个项目中涉及的...

    安卓Android源码——四次元新浪微博客户端项目.zip

    《安卓Android源码——四次元新浪微博客户端项目》 这个项目是针对安卓平台的一个开源实现,旨在解析并展示了新浪微博客户端的源代码。源码分析对于开发者来说是宝贵的资源,能够帮助我们深入理解移动应用的开发...

    andoid新浪微博客户端源代码

    【标签】:“andoid新浪微博客户端源代码”、“android”、“java”、“新浪微博客户端” 本文将深入探讨基于Android的新浪微博客户端源代码,主要涉及以下几个关键知识点: 1. **Android开发基础**:Android是...

    Android源码——新浪微博客户端源码.zip

    本篇将聚焦于“Android源码——新浪微博客户端源码”,通过深度解析这个开源项目,我们不仅可以学习到Android应用开发的基本框架,还能探索微博客户端的具体实现细节。 首先,我们要明确的是,Android源码分析通常...

    Android 新浪微博客户端源码2.zip

    【Android 新浪微博客户端源码2.zip】是一个包含Android应用项目的源码,主要目标是提供一个参考和学习的平台,帮助开发者了解如何构建一个类似新浪微博的客户端应用。这个项目使用了Java编程语言,这是Android平台...

    应用源码(精)新浪微博客户端源码.zip

    《深入剖析:微博客户端源码解析》 在Android开发领域,源码学习是提升技能、理解框架工作原理的重要途径。本篇文章将围绕“应用源码(精)新浪微博客户端源码”这一主题,深入探讨其中涉及的技术点,为你的毕业设计...

Global site tag (gtag.js) - Google Analytics