• Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发
  • 大学android开发基础课程,代码齐全,移动开发项目教程(双色)》(李扬)。
  • 丛编项: 21世纪高等院校移动开发人才培养规划教材 本书通过精心设计的7个工作项目,全程贯彻“做中学”理念,先实践认知,后理论拓展,由浅入深,让读者逐步掌握Android应用程序用户界面布局设计、2D绘图和游戏...
  • Android移动开发教程(项目式)
  • Android移动开发项目教程(第2版) 这本书的全部源代码
  • 文件中包含《Android移动应用开发案例教程》一书中项目源代码,供初学者参考。
  • android移动开发基础教程,适合初学着使用 本书共10章,第1-2章主要讲解Android的基础知识,包括Android起源、Android体系结构、开发环境搭建、UI布局等。第3-8章主要讲解Android中的数据存储以及四大组件,包括文件...
  • Android移动开发案例教程源代码第1-2章所有,涵盖与教程相对应的所有源码内容
  • 这个是工业和信息化“十三五”人才培养规划教材Android移动开发基础案例教程,黑马程序员编著配套源代码
  • 在做项目开发的时候参考了欧楠老师的一套Android4.2开发手机新闻移动客户端的视频教程,对我的帮助蛮大的,在此想给正在搞android开发的朋友推荐一下。这套教程一共是20讲,就是讲如何在android4.2上开发手机新闻...

            在做项目开发的时候参考了欧楠老师的一套Android4.2开发手机新闻移动客户端的视频教程,对我的帮助蛮大的,在此想给正在搞android开发的朋友推荐一下。这套教程一共是20讲,就是讲如何在android4.2上开发手机新闻移动客户端的,主要介绍了运行于Android平台的手机新闻客户端的开发,开发过程中主要用到了Android应用的UI设计技术,多种控件和视图的使用、异步更新UI多线程、HTTP通信技术以及JSON数据的解析等技术。是我目前遇到的比较优秀的一套教程。




    参考资料:

    百度:http://pan.baidu.com/s/1jGmfkQq


    360:http://yunpan.cn/Q4cDqmEVPb9vZ (访问密码:cf93)

    展开全文
  • ANDROID移动开发基础案例教程,黑马程序员。人民邮电出版社。本书从初学者的角度出发,采用案例驱动式教学方法,对Android基础知识进行讲解。在案例设计上力求贴合实际需求,真正做到把书本上的知识应用到实际开发中...
  • 移动开发项目教程,ndroid移动开发项目教程(第2版)-源代码.
  • 移动开发也称为手机开发,或叫做移动互联网开发。是指以手机、PDA、UMPC等便携终端为基础,进行相应的开发工作,
  • 参考书目:《Android移动开发基础案例教程》 出版社:中国工信出版集团丨人民邮电出版社 编著:黑马程序员 --------------- 很认真写的期末考试总结,供大家参考! · 移动通信1G、2G、3G、4G的概念、优缺点...

     

    参考书目:《Android移动开发基础案例教程》 

    出版社:中国工信出版集团丨人民邮电出版社

    编著:黑马程序员

    ---------------

    很认真写的期末考试总结,供大家参考!

     

    · 移动通信1G、2G、3G、4G的概念、优缺点

    答:1G是模拟信号,支持语音通话,安全性差,容易被窃听,代表产品:大哥大;2G采用数字信号传输,信号强,支持收发短信,支持小的Java程序,支持数据业务,GPRS工作在2.5GHz,EDGE工作在2.75GHz;3G主要技术有TDSCDMA(中国移动)、WCDMA(中国联通)和CDMA2000(中国电信),HSDPA工作在3.5GHz,提供较快的数据业务;4G是指第四代移动通信技术,主要技术有TD-LTE(中国移动、中国联通、中国电信)和FDD-LTE(中国联通、中国电信),提供更快的数据业务,通过VoLTE技术,支持语音通话在4G频段上进行,提供高清视频、语音通话。

    · Android体系结构由几层构成?分别是哪几层?简单介绍每一层的概念、应用

    答:四层,分别是应用程序层(Applications)、应用程序框架层(Application Framework)、核心类库层(Libraries)以及Linux内核层(Linux Kernel)。应用程序层是应用程序的集合,各种安装在手机上的App都属于这一层;应用程序框架层主要提供了/构建应用程序时/用到的各种API接口,Android自带的一些核心应用就是使用这些API完成的,例如视图(View)、活动管理器(Activity Manager)、通知管理器(Notification Manager)等;核心类库层包含了系统库/及Android运行时库,系统库主要是通过C/C++库来为Android系统提供主要的特性支持,如OpenGL/ES库提供了3D绘图的支持,Android运行时库提供了Dalvik虚拟机(安卓5.0开始彻底更换为ART);Linux内核层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动等。

    · Drawable、Layout、AndroidManifest.xml分别存放什么内容?

    答:src目录是源代码目录,存放的是.java文件;gen目录存放ADT自动生成的java文件;bin目录保存了编译过程中产生的文件,以及最终的apk文件;res是资源目录,其中,drawable目录用来保存同一个程序中针对不同屏幕尺寸需要显示的不同大小的图像文件,layout目录用来保存与用户界面相关的布局文件,values目录保存颜色、风格、主题和字符串等资源;project.properties文件记录了Android工程的相关设置;AndroidManifest.xml是XML格式的Android程序声明文件,包含了Android系统运行Android程序前所必须掌握的重要信息,这些信息包括应用程序名称、icon、包名称、模块组成、授权和SDK最低版本等,而且每个Android程序必须在根目录下包含一个AndroidManifest.xml文件。

    · Android的常用布局有几种?分别简单介绍它们的特点

    答:分别有LinearLayout(线性布局)、RelativeLayout(相对布局)、FrameLayout(帧/框架布局)、TableLayout(表格布局)、GridLayout(网格布局)和AbsoluteLayout(绝对布局)六种。线性布局(LinearLayout)主要以水平和垂直方式来显示界面中的控件;相对布局(RelativeLayout)是通过相对定位的方式指定控件位置,后放置的控件依赖于先放置的控件,是Android默认的布局;帧布局(FrameLayout)是Android中最简单的布局,该布局为每个加入其中的控件创建一个空白区域,所有控件都默认显示在屏幕左上角,并按照先后放入的次序重叠排放,先放入的控件显示在最底层,后放入的控件显示在最顶层;表格布局(TableLayout)是以表格形式排列控件的,通过行和列将界面划分为多个单元格,每个单元格都可以添加控件;网格布局(GridLayout)是Android 4.0新支持的布局方式,将用户界面划分为网格,界面元素可随意摆放在这些网格中;绝对布局(AbsoluteLayout)是通过指定x、y坐标来控制每一个控件位置的。

    · TextView和Button的常用属性有哪些?

     

    控件属性

    功能描述

    TextView

    android:text

    设置显示文本

    android:textColor

    设置文本的颜色

    android:textSize

    设置文字大小,推荐单位为sp,如android:textSize = “15sp”

    android:textStyle

    设置文字样式,如bold(粗体),italic(斜体),bolditalic(粗斜体)

    android:height

    设置文本区域的高度,推荐单位为dp

    android:width

    设置文本区域的宽度,推荐单位为dp

    android:maxLength

    设置文本长度,超出不显示,如android:maxLength = “10”

    android:password

    设置文本以密码形式“.”显示

    android:gravity

    设置文本位置,如设置成”center”,文本将居中显示

    android:phoneNumber

    设置以电话号码的方式输入

    android:layout_height

    设置TextView控件的高度

    android:layout_width

    设置TextView控件的宽度

     

    控件属性

    功能描述

    Button

    android:text

    设置显示文本

    android:layout_height

    设置Button控件的高度

    android:layout_width

    设置Button控件的宽度

    android:layout_weight

    设置Button控件的权重

    android:onClick

    点击此控件时调用的方法

    android:drawable

    在Button组件上放置图片

    · Android的四大组件是什么?它们的作用分别是什么?

    答:Activity(界面)为用户提供可视化界面及操作;Service(服务)是一个长期运行在后台的用户组件,适用于开发没有用户界面且长时间在后台运行的应用功能;Content Provider(数据交换/内容提供者)是在不同程序之间实现数据共享;Broadcast Receiver(广播/广播接收者)是监听系统中的广播消息,以实现在不同组件之间的通信。

    · Activity的生命周期有几种状态?有几种方法?什么时候调用这些方法?作用是什么?

    答:Activity的生命周期分为5种状态,分别是启动状态、运行状态、暂停状态、停止状态和销毁状态。启动状态很短暂,一般当Activity启动之后便会进入运行状态;运行状态时Activity处于屏幕最前端,它是可见、有焦点的,可以与用户进行交互;暂停状态是当Activity在界面上被部分遮挡,且不能与用户进行交互,如锁屏;停止状态是当Activity在界面上被完全遮挡,完全不能被用户看到,当系统内存不足时,很容易被销毁;销毁状态时Activity将被kill,清理出内存。

    Activity的生命周期中主要涉及7种方法(事件回调函数),分别是onCreate()、onStart()、onResume、onPause()、onStop()、onDestroy()和onRestart()方法/函数。onCreate()方法是在Activity创建时调用,通常做一些初始化设置;onStart()方法在Activity即将可见时调用;onResume()方法在Activity可以接收用户输入时调用,此时的Activity位于Activity栈的栈顶;onPause()方法在进入暂停状态时被调用,主要用来保存持久数据、关闭动画、释放CPU资源等;onStop()方法在Activity不对用户可见时调用,Activity进入停止状态;onDestroy()方法在Activity销毁时调用;onRestart()方法在Activity从停止状态进入活动状态前调用。

    · Activity之间的跳转需要用到(       )组件,根据开启目标组件的方式不同,Intent被分为哪两种类型?简单介绍这两种类型

    答:Activity之间的跳转需要用到Intent组件,Intent是一种轻量级的消息传递机制,可以在同一个应用程序内部的不同组件之间传递信息,根据开启目标组件的方式不同,Intent被分为显式启动(意图)和隐式启动(意图)两种类型,显式启动可以通过名称开启指定的目标组件;隐式启动不需要指明需要启动哪一个Activity,而是通过指定action和category等属性信息,由Android系统来决定。

    · 对于Android平台提供的5种数据存储方式,简单介绍它们

    文件存储

    分为内部存储和外部存储,直接使用Android文件系统存储数据,可以存储体积较大的数据;

     

    SharePreferences

    它是Android提供的用来存储一些简单的配置信息的一种机制,采用了.xml格式将数据存储到设备中,可以存储应用程序的各种配置信息,如用户名、密码等;

     

    ContentProvider

    主要用于应用程序之间的数据交换,它可以将自己的数据共享给其他应用程序使用;

     

    SQLite数据库

    Android自带的一个轻量级数据库,支持基本SQL语法,利用很少的内存就有很好的性能,一般使用它作为复杂数据的存储引擎,可以存储用户信息等;

     

    网络存储

    将数据存储到服务器上,通过网络提供的存储空间来存储、获取数据信息。

     

     

    · 【程序改错题、程序填空题】

    package com.example.saveqq;  
      
    import java.util.HashMap;  
    import java.util.Map;  
      
    import android.content.Context;  
    import android.content.SharedPreferences;  
      
    public class SPSaveQQ{  
        // 保存QQ账号和登录密码到data.xml文件中  
        public static boolean saveUserInfo(Context context, String number, String password) {  
            SharedPreferences sp = context.getSharedPreferences("data", Context.MODE_PRIVATE);  
            SharedPreferences.Editor edit = sp.edit();  
            edit.putString("userName", number);  
            edit.putString("pwd", password);  
            edit.commit();  
            return true;  
        }  
        //从data.xml文件中获取存储的QQ账号和密码  
        public static Map<String, String> getUserInfo(Context context) {  
            SharedPreferences sp = context.getSharedPreferences("data", Context.MODE_PRIVATE);  
            String number = sp.getString("userName", null);  
            String password = sp.getString("pwd", null);  
            Map<String, String> userMap = new HashMap<String, String>();  
            userMap.put("number", number);  
            userMap.put("password", password);  
            return userMap;  
        }  
    }  

     

    · 服务的启动方式有几种?分别是哪几种?

    答:两种。分别是startService方式启动和bindService方式启动,通过startService()方法启动服务,服务会长期在后台运行,并且服务的状态与开启者的状态没有关系,即使启动服务的组件已经被销毁,服务也会依旧运行;当一个组件通过bindService()启动服务时,服务会与组件绑定,一个被绑定的服务提供一个客户端与服务器接口,允许组件与服务交互、发送请求、得到结果,多个组件可以绑定一个服务,当调用onUnbind()方法时,这个服务就会被销毁。

    · 【程序改错题、程序填空题】

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        xmlns:tools="http://schemas.android.com/tools"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:background="@drawable/bg"  
        android:orientation="vertical">  
      
        <EditText  
            android:id="@+id/et_inputpath"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:text="data/data/com.example.musicplayer/a.mp3" />  
        <LinearLayout  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:layout_marginTop="10dp"  
            android:layout_gravity="center_horizontal"  
            android:gravity="center"  
            android:orientation="horizontal" >  
            <TextView  
                 android:id="@+id/tv_play"  
                 android:layout_width="0dp"  
                 android:layout_height="wrap_content"  
                 android:layout_weight="1"  
                 android:drawablePadding="3dp"  
                 android:drawableTop="@drawable/play"  
                 android:gravity="center"  
                 android:text="播放" />  
            <TextView  
                 android:id="@+id/tv_pause"  
                 android:layout_width="0dp"  
                 android:layout_height="wrap_content"  
                 android:layout_weight="1"  
                 android:drawablePadding="3dp"  
                 android:drawableTop="@drawable/pause"  
                 android:gravity="center"  
                 android:text="暂停" />  
        </LinearLayout>  
    </LinearLayout>  

    · 【程序改错题、程序填空题】

    package com.example.readsms;  
      
    import java.util.ArrayList;  
    import java.util.List;  
      
    import android.app.Activity;  
    import android.content.ContentResolver;  
    import android.database.Cursor;  
    import android.net.Uri;  
    import android.os.Bundle;  
    import android.view.View;  
    import android.widget.TextView;  
      
    public class MainActivity extends Activity {  
        private TextView tvSms;  
        private TextView tvDes;  
        private String text = "";  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            // TODO Auto-generated method stub  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);  
            tvSms = (TextView) findViewById(R.id.tv_sms);  
            tvDes = (TextView) findViewById(R.id.tv_des);  
        }  
        public void readSMS(View view) {  
            Uri uri = Uri.parse("content://sms/");  
            ContentResolver resolver = getContentResolver();  
            Cursor cursor = resolver.query(uri, new String[]{ "_id", "address",   
                    "type", "body","date"}, null, null, null);  
            List<SmsInfo> smsInfos = new ArrayList<SmsInfo>();  
            if(cursor != null && cursor.getCount() >0 ) {  
                tvDes.setVisibility(View.VISIBLE);  
                while(cursor.moveToNext()) {  
                    int _id = cursor.getInt(0);  
                    String address = cursor.getString(1);  
                    int type = cursor.getInt(2);  
                    String body = cursor.getString(1);  
                    long date = cursor.getLong(4);  
                    SmsInfo smsInfo = new SmsInfo(_id, address, type, body, date);  
                    smsInfos.add(smsInfo);  
                }  
                cursor.close();  
            }  
            for (int i = 0;i < smsInfos.size(); i++) {  
                text += "手机号码:" + smsInfos.get(i).getAddress() + "\n";  
                text += "短信内容:" + smsInfos.get(i).getBody() + "\n\n";  
                tvSms.setText(text);  
            }  
        }  
          
    }  

    · 【程序改错题、程序填空题】

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
       xmlns:tools="http://schemas.android.com/tools"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:background="@android:color/white"  
        tools:context=".MainActivity">  
        <ImageView  
            android:id="@+id/iv_flower"  
            android:layout_width="150dp"  
            android:layout_height="267dp"  
            android:layout_centerInParent="true"  
            android:background="@layout/frame"  
            android:layout_marginBottom="20dp" />  
        <Button  
            android:id="@+id/btn_play"  
            android:layout_width="70dp"  
            android:layout_height="70dp"  
            android:layout_centerInParent="true"  
            android:background="@android:drawable/ic_media_play"/>  
    </RelativeLayout>  

    · 【程序改错题、程序填空题】

    package com.example.frame;  
      
    import android.app.Activity;  
    import android.graphics.drawable.AnimationDrawable;  
    import android.os.Bundle;  
    import android.view.View;  
    import android.widget.Button;  
    import android.widget.ImageView;  
      
    public class MainActivity extends Activity implements View.OnClickListener{  
        private ImageView iv_flower;  
        private Button btn_start;  
        private AnimationDrawable animation;   
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);  
            iv_flower = (ImageView) findViewById(R.id.iv_flower);  
            btn_start = (Button) findViewById(R.id.btn_play);  
            btn_start.setOnClickListener(this);  
            //拿到AnimationDrawable对象  
             animation = (AnimationDrawable)iv_flower.getBackground();         
        }  
      
        public void onClick(View v) {  
            //播放动画  
            if(!animation.isRunning()){  
                animation.start();  
                btn_start.setBackgroundResource(android.R.drawable.ic_media_pause);  
            }else{  
                animation.stop();  
                btn_start.setBackgroundResource(android.R.drawable.ic_media_play);  
            }  
        }  
    }  

    · 【程序改错题、程序填空题】

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        xmlns:tools="http://schemas.android.com/tools"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:orientation="vertical"  
        tools:context=".MainActivity" >  
      
        <RelativeLayout  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content" >  
      
            <EditText  
                android:id="@+id/et_path"  
                android:layout_width="match_parent"  
                android:layout_height="wrap_content"  
                android:hint="请输入视频文件的路径"  
                android:layout_toLeftOf="@+id/bt_play" />  
      
            <ImageView  
                android:id="@+id/bt_play"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:layout_alignParentRight="true"  
                android:layout_centerVertical="true"  
                android:src="@android:drawable/ic_media_play" />  
        </RelativeLayout>  
      
        <LinearLayout  
            android:layout_width="wrap_content"  
            android:layout_height="match_parent"  
            android:layout_below="@+id/play" >  
      
            <VideoView  
                android:id="@+id/video_view"  
                android:layout_width="match_parent"  
                android:layout_height="match_parent" />  
        </LinearLayout>  
      
    </LinearLayout>  

    · 【程序改错题、程序填空题】

    package com.example.videoview;  
      
    import android.app.Activity;  
    import android.media.MediaPlayer;  
    import android.os.Bundle;  
    import android.view.View;  
    import android.widget.EditText;  
    import android.widget.ImageView;  
    import android.widget.MediaController;  
    import android.widget.VideoView;  
    public class MainActivity extends Activity implements View.OnClickListener {  
        private EditText et_path;  
        private ImageView bt_play;  
        private VideoView videoView;  
        private MediaController controller;  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);  
            et_path = (EditText) findViewById(R.id.et_path);  
            bt_play = (ImageView) findViewById(R.id.bt_play);  
            videoView = (VideoView) findViewById(R.id.video_view);  
            controller = new MediaController(this);  
            videoView.setMediaController(controller);  
            bt_play.setOnClickListener(this);  
        }  
        @Override  
        public void onClick(View v) {  
            switch (v.getId()) {  
            case R.id.bt_play:  
                play();  
                break;  
            }  
        }  
        private void play() {  
            if (videoView != null && videoView.isPlaying()) {  
                bt_play.setImageResource(android.R.drawable.ic_media_play);  
                videoView.stopPlayback();  
                return;  
            }  
            videoView.setVideoPath(et_path.getText().toString());  
            videoView.start();  
            bt_play.setImageResource(android.R.drawable.ic_media_pause);  
            videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {  
                @Override  
                public void onCompletion(MediaPlayer mp) {  
                    // TODO Auto-generated method stub  
                    bt_play.setImageResource(android.R.drawable.ic_media_play);  
                }  
            });  
        }  
    }  

     

    END.

    展开全文
  • 这里面有基础的安卓开发教程,实用老师教学,学生课后巩固练习。附带安卓开发实战教程链接。
  • android移动应用开发基础教程PPT,适合教育工作者,上课用。当然,想进行android入门的童鞋也可以下载来看看,适合初学者。
  • 直接去出版社官网下载就好,简单有效,亲自经历,避免踩已踩过的坑

    直接去出版社官网下载就好,简单有效,亲自经历,避免踩已踩过的坑

    展开全文
  • Android应用开发案例教程(高等学校计算机科学与技术项目驱动案例实践规划教材)》编著者毋建军、徐振东、林瀚。 《Android应用开发案例教程(高等学校计算机科学与技术项目驱动案例实践规划教材)》应用“项目驱动...
  • 跟大家分享一下过程,经验(干货)。 文章目录一.开发环境选择:1.AndoridStudio比Eclipse2.AndroidStudio和Eclipse不同点总结二....Android Studio是一项全新的基于IntelliJ IDEA的Android开发环境。Android Studi...

    跟大家分享一下过程,经验(干货)。

    一.开发环境选择:

    我使用的环境:Android studio 5.2
    Android Studio是一项全新的基于IntelliJ IDEA的Android开发环境。Android Studio提供了集成的Android开发工具用于开发和调试。

    基于Gradle的构建支持;Android特定重构和快速修复;提示工具更好地对程序性能、可用性、版本兼容和其他问题进行控制捕捉;支持ProGuard和应用签名功能;自带布局编辑器,可以让你拖放UI组件,并在多个屏幕配置上预览布局,等等。

    1.AndoridStudio比Eclipse

    AndroidStudio智能识别更强大
    AndroidStudio的资源文件可以在代码中预览
    AndroidStudio编辑历史更详细
    AndoridStudio构建程序界面更方便
    
    Eclipse创建项目更简单
    Eclipse中的项目体积比较小
    Eclipse中的配置文件无需更新
    Eclipse中多项目管理很方便
    

    2.AndroidStudio和Eclipse不同点总结

    总的来说AndroidStudio比Eclipse更要强大,同时通过AndoridStudio来进行Android项目开发是一种不可颠覆的趋势和潮流,毕竟Eclipse可以做的东西很多,不够专注!而AndroidStudio只面向手机开发, 术业有专攻,在开发Android项目方面的优势肯定是很明显的。但AndroidStudio也有缺点,特别是在使用gradle文件方面,用户体验亟需提高,需要更多地考虑一下不能正常使用国外网站的地区如何正常地使用该工具来构建程序。

    大家可以根据自己的需要,导师的要求自行选择

    二.遇到的问题and经验分享

    我在写代码的过程中,遇到了些问题 ,不知道大家有没有经历过。

    1. 各个页面的衔接掌握的不熟练,及其不顺畅。
    2. 选择的以下参考代码过于盲目,忽略了好多方便的工具类。
    3. 模拟器预览项目过与卡,可以发布到Android手机上。
    4. 监听,服务,生命周期,java基础掌握的不够熟练。
    5. 有很多小bug是可以用自己学的Java知识解决的,却过于依赖搜索引擎。
    6. 后台搭建基础为0。
    7. 有好多编译器自动填充功能没有用上。
    8. 听一门android开发课程,比自己按照大纲查资料来的实惠的多,并且学习android开发的话,看书的话效率很低,掌握不透彻,一个知识跟一个练习会更加熟练。

    三.知识分享

    关于知识分享,大家可以看一下我的Android 移动开发专栏,小白入门,大家就当消磨时间吧。
    分享下静态效果:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • android移动开发案例源代码打包下载  
    展开全文
1 2 3 4 5 ... 20
收藏数 21,261
精华内容 8,504