湖南某科技大学 安卓Android移动开发基础期中考试笔记

前言

建议大家把第三章的三个实战演练和本笔记的所有代码部分都在AS中手打一遍,手打的意思是看懂之后自己写出来,而不是照着抄。这不90分就到手了?

第一章 基础

  • Android是一款基于Linux平台的开源操作系统,主要用于移动开发中。

  • Android体系结构

    一个实例:闹钟->通知管理器->多媒体框架->音频驱动

    1. 应用程序层(application)

      应用程序层是一个核心应用程序的集合,所以安装在手机上的应用程序都在这一层。例如:系统自带的联系人程序、短信程序、下载的小游戏。

    2. 应用程序框架层(application framework) Android SDK 和这一层有关

      应用程序框架层主要提供构建应用程序时用到的各种API。例如:视图(View)、活动管理器(activity manager)、通知管理器(notification manager)。

    3. 核心类库(libraries)

      • 核心类库包含系统库和Android运行时库
      • 系统库这一层主要通过c/c++来为Android系统提供主要的特性支持。例如:OpenGL/ES库提供类3D绘图的支持、Webkit库提供浏览器内核的支持。
      • Android运行时库(android runtime)主要提供了一些核心库,能够允许开发者使用Java语言来编写Android程序。
    4. Linux内核(Linux Kernel) 驱动

      Linux内核为Android设备的各种硬件提供了底层的驱动。例如:显示驱动、音频驱动。

  • Android程序结构

    • manifests

      用于存放AndroidManifest.xml文件,整个项目的配置文件。注册四大组件、添加权限。

      <?xml version = "1.0" encoding="utf-8"?>
      <manifest xmls:android="http://schemas.anroid.com/apk/res/android"package="cn.itcast.myapplication" ><applicationandroid:allowBackup="true"  //设置应用数据能够被备份或恢复。android:icon="@mipmap/ic_launcher"  //设置图标。android:label="HelloWorld"  //设置应用程序名android:supportsRtl="true"  //设置允许RTL(从右到左布局)。android:theme="@style/AppTheme" >  //设置主题。<activity android:name=".MainActivity" ><intent-filter><action anroid:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER"</intent-filter></activity></application></manifest>
      
    • java

      用于存放所有的Java代码。

    • res

      • drawable

        用于存放图片及XML文件

      • layout

        存放布局文件

      • mipmap

        用于存放应用程序图标

      • value

        用于放置定义的字符串

    • Gradle Scripts

      存放项目相关文件

第二章 UI

  • 线性布局

    • android:orientation属性,有vertical和horizontal(默认)两个值

    • android:layout_width和android:layout_heigh两个属性,有match_parent(继承父组件大小)、wrap_content(内容大小)两个值或者是数值。

    • android:layout_weight(权重),值为数字,带引号。使用weight属性时,控件宽度不再由width决定,使用width一般设置为0dp。

  • 相对布局

    • 设置控件位置的属性

      以下属性值为true或false

      • android:layout_centerParent 设置当前控件位于父布局的中央位置
      • android:layout_centerVertical 设置当前控件位于父布局垂直居中位置
      • anroid:layout_centerHorizontal 设置当前控件位于父布局水平居中位置
      • anroid:layout_alignParentTop 设置当前控件与父控件顶端对齐
      • android:layout_alignParentBottom 设置当前控件与父控件底端对齐
      • android:layout_alignParentLeft 设置当前控件与父控件左对齐
      • android:layout_alignParentRight 设置当期控件与父控件右对齐

      以下属性值为某控件的ID

      • android:layout_above 设置当前控件位于某控件的上方
      • android:layout_below 设置当前控件位于某控件的下方
      • android:layout_toLeftOf 设置当前控件位于某控件的左边
      • android:layout_toRightOf 设置当前控件位于某控件的右边
      • android:layout_alignTop 设置当前控件与某控件顶端对齐
      • android:layout_alignBottom 设置当前控件与某控件底端对齐
      • android:layout_alignLeft 设置当前控件与某控件左对齐
      • android:layout_alignRight 设置当前控件与某控件右对齐
    • 设置某控件 间距的属性

      某控件指的是?

      • android:layout_marginTop 设置当前控件上边界与某控件的距离
      • android:layout_marginBottom 设置当前控件下边界与某控件的距离
      • android:layout_marginLeft 设置当前控件左边界与某控件的距离
      • android:layout_marginRight 设置当前控件有边界与某控件的距离
    • 设置布局内边距的属性

      • android:paddingTop 设置布局顶部内边距的距离
      • android:paddingBottom 设置布局底部内边距的距离
      • android:paddingLeft 设置布局左边内边距的距离
      • android:paddingRight 设置布局右边内边距的距离
  • 表格布局

    序号从0开始

    TableLayout布局属性

    • android:stretchColumns 设置某列被拉伸
    • android:shrinkColumns 设置某列被收缩
    • android:collapseColumns 设置某列被隐藏

    TableLayout控件属性

    • android:layout_column 设置该控件显示位置
    • android:layout_span 设置该单元格占几列,默认为一列
  • LogCat的使用

    Log类日志输出六个级别(从低到高)

    1. Verbose Log.v(String, String)
    2. Debbug Log.d(String, String)
    3. Info Log.i(String, String)
    4. Warning Log.w(String, String)
    5. Error Log.e(String, String)
    6. Assert 没有对应的静态方法 级别最高

第三章 Activity

Activity的生命周期

  1. 生命周期状态

    1. 启动状态
    2. 运行状态
    3. 暂停状态
    4. 停止状态
    5. 销毁状态
  2. 生命周期方法

    1. onCreate()

      activity创建时调用

    2. onStart()

      activity即将可见时调用

    3. onResume()

      activity获取焦点与用户开始交互时调用

    4. onPause()

      activity被其他activity覆盖或锁屏时调用

    5. onDestroy()

      activity被销毁时调用

    6. onRestart()

      activity从停止状态再次启动时调用

Activity的启动模式

​ 在AndroidManifest.xml中,通过标签的anroid:launchMode属性可以设置启动模式。

  1. standard模式

    默认启动模式,每启动一个activity就会在栈顶创建一个新的实例,闹钟程序通常采用此方式

  2. singleTop模式

    先判断启动的activity实例是否位于栈顶,如果位于栈顶则直接复用,浏览器的书签通常采用此模式

  3. singleTask模式

    先检查栈中是否存在当前activity实例,如果存在,则直接使用,此实例之上的所有实例全部出栈

  4. singleInstance模式

    启动一个新的任务栈来管理activity实例,无论从哪个任务栈中启动该activity,该实例在系统中只有一个。

Activity之间的跳转

  1. 显式意图

    Intent intent = new Intent(this, Ativity02.class);
    startActivity(intent);
    
  2. 隐式意图

    MainActivity.java

    Intent intent = new Intent();
    intent.setAction("cn.itcast.START_ACTIVITY");
    startActivity(intent);
    

    AndroidManifest.xml

    <activity android:name="cn.itcast.Activity02"><intent-filter><action android:name="cn.itcast.START_ACTIVITY" /><category android:name="anroid.intent.category.DEFAULT" /></intent-filter>
    </activity>
    
  3. 打开浏览器实现

    MainActivity.java

    public class MainActivity extends AppCompatActivity{@Overrideprotected void onCreate(Bundle bundle){super.onCreate(bundle);setContentView(R.layout.activity_main);Button button = (Button)findViewById(R.id.main_button);button.setOnClickListence(new View.OnClickListence(){public void onClick(View v){Intent intent = new Intent();intent.setAction("android.intent.action.VIEW");intent.setData(Uri.parse("http://www.baidu.com"));startActivity(intent);}});}
    }
    
  4. 数据传递

    MainActivity.java

    Intent intent = new Intent(this, Activity2.class);
    intent.putExtra("username", "yuhaoWu");
    startActivity(intent);
    

    Activity2.java

    Intent intent = getIntent();
    string username = intent.getStringExtra("username")
    
  5. 数据回传

    Activity1.java

        @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = new Intent(this, Activity2.class);startActivityForResult(intent,9527);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent intent) {super.onActivityResult(requestCode, resultCode, intent);if(requestCode == 9527){if(resultCode == 1){String data = intent.getStringExtra("data");System.out.println(data);}}}
    

    Activity2.java

        @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);Intent intent = new Intent();intent.putExtra("data","yuhaoWu");setResult(1, intent);}
    

    Activity1打开Activity2,Activity2关闭后Activity1调用onActivityResult打印出ACtivity2回传的”yuhaoWu“

    • intent.getSerializableExtra()方法

第四章 数据存储

Activity类实现了Context类,如果本章使用了Context类静态方法的语句不在Activity类里,则前面应加上“Context.”,如Context.openFileInput(filename)和Context.getSharedPreference(filename, mode)

数据存储方式

  • 文件存储

    提供了openFileInput()和openFileOutput()方法读取设备上的文件。可以存储大数据,如文本、图片、音频。

  • SharedPreferences

    用来存储一些简单的配置信息,采用XML格式将数据存储到数据库中如用户名、密码。

  • SQLite数据库

    支持SQL语法,利用很少的内存就有很好的性能,一般作为复杂信息的存储引擎,可以存储用户信息。

  • ContentProvider

    四大组件之一,主要用于应用程序之间的数据交换,它可以讲自己的数据共享给其他应用程序使用

  • 网络存储

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

文件存储

  1. 内部存储

    使用openFileInput(String filename, int mode)和openFileOutput(String filename)分别创建fileInputStream对象和fileOutputStream对象,进行文件读写。

    String content = "helloworld";
    fileOutputStream fos = openFileInput(filename, MODE_PRIVATE);
    fos.write(content.getBytes());
    fos.close();
    

    fileInputStream fis = openFileInput(filename);
    byte[] buffer = new byte[fis.available()];
    fis.read(buffer);
    String content = new String(buffer);
    fis.close;
    
  2. 外部存储

    使用外部存储前必须使用Environment.getExternalStorageState()方法来确认外部设备是否可用

    必须先在manifest添加SD卡读写权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    

    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){File SDPath = Environment.getExternalStorageDirectory();File file = new File(SDPath, "data.txt");String data = "helloworld";fileOutputStream fos = new fileOutputStream(file);fos.wirte(data.getByte());fos.close();
    }
    

    读(略)

SharedPreferences

存储数据并获取

SharedPreferences sp = getSharedPreferences("data", MODE_PRIVATE); //获得SharedPreferences对象
SharedPreferences.Editor editor = sp.edit(); //获得Editor对象,这样才能对SharedPreferences对象编辑
editor.putString("name", "yuhaoWu");  //写入数据
editor.putInt("age", 20);
editor.remove("name");  //删除key为"name"的数据
editor.clear();  //删除全部数据
editor.putString("sex", "male");
editor.commit();  //提交!!!不提交不会更改。
String sex = sp.getString("sex", "");获取数据,若不存在,则返回""空。

第五章 SQLite数据库

SQLite数据库的创建

创建一个继承自SQLiteOpenHelper的Myhelper类,并重写onCreate()方法和Upgrade()方法

public class MyHelper extends SQLiteOpenHelper{public MyHelper(Context context){super(context, "itcast.db", null, 2); // 四个参数,上下文对象、 数据库名称、 游标工厂(通常是null)、数据库版本} @Overridepublic void onCreate(SQLiteDatabase db){db.execSQL("CREATE TABLE information(_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20),price INTEGER)") //}
}

简答题 怎么做才能增/删/改/查一条数据

  • 增加一条数据

    通过调用helper的getWritableDatabase()方法得到可读写的SQLiteDatabase对象,然后新建一个ContentValues对象并将要插入的数据添加到ContentValues对象中,最后调用LSQLiteDatabase对象的**insert()**方法将数据插入到表中,再关闭数据库。

    public void insert(String name, String price){SQLiteDatabase db = helper.getWritableDatabase();  //获取可读写的SQLiteDatabase对象ContentValues values = new ContentValues();  //新建ContentValues对象values.put("name", name);  //添加数据values.put("price", price);db.insert("information", null, values)  //插入一条数据到information表,如果将要插入的行为空行时,将列名设置为nulldb.close();  //关闭数据库
    }
    
  • 修改一条数据

    通过调用helper的getWritableDatabase()方法得到可读写的SQLiteDatabase对象,然后新建一个ContentValues对象并将要修改的数据添加到ContentValues对象中,最后调用LSQLiteDatabase对象的updata()方法将数据插入到表中,再关闭数据库。

    public void updata(String name1, String price1){SQLiteDatabase db = helper.getWritableDatabase();  //获取可读写的SQLiteDatabase对象ContentValues values = new ContentValues();  //新建ContentValues对象values.put("price2", price1);db.updata("information", values, "name2 = ?", new String[]{name1}); 修改name2 = name1的元组的price2为price1db.close();  //关闭数据库
    }
    
  • 删除一条数据

    通过调用helper的getWritableDatabase()方法得到可读写的SQLiteDatabase对象,然后调用SQLiteDatabase对象的delete()方法删除表中的数据,最后关闭数据库。

    public int delete(long id){SQLiteDatabase db = helper.getWritableDatabase();  //获取可读写的SQLiteDatabase对象db.delete("information", "_id = ?", new String[] {id+""}); //删除_id为id的元组db.close();  //关闭数据库
    }
    
  • 查询一条数据 (重要但我认为不会考)

    通过调用helper的getReadableDatabase()方法得到可读的SQLiteDatabase对象,然后调用SQLiteDatabase对象的query()方法返回一个提供了遍历查询方法的行数集合Cursor,通过Cursor的方法来遍历查询数据,最后关闭Cursor和数据库。

    public boolean find(long id){SQLiteDatabase db = helper.getReadableSQLiteDatabase();Cursor cursor = db.query("information",  //表名null,           //列名"_id=?",        //查询条件子句new String[]{""+id}, //查询条件子句对应的条件值null,  //分组方式null,  //having条件null   //排序方式);  //查询_id为id的所有元组boolean result = cursor.moveToNext();cursor.close();db.close();return result;
    }
    

ListView控件

Android列表控件ListView详解

ListView指定了id属性之后,就会显示,如果没有进行数据适配,那么程序运行后界面空白,无数据显示。

  • 常用适配器

    • BaseAdapter

      方法名称 功能描述
      getCount() 得到item条目的总数
      getItem(int position) 根据position得到某个item的对象
      getItemId(int position) 根据position得到某个item的id
      getView(int position, View convertView, ViewGroup parent) 得到相应position对应的item视图,position是当前item的位置,convertView用于复用旧视图,parent用于加载XML布局
    • SimpleAdapter

    • ArrayAdapter

  • ListView的优化

    1. 复用convertView
    2. 使用ViewHolder类
  • ListView及其优化实战(看看就行,记一下关键代码)

    activity_main文件添加一个ListView控件并命名ID及其他属性,另外需要新建一个list_item.xml文件作为ListView对应的item布局,其中有一个ImageView控件item_iv和一个TextView控件item_tv。

    MainActivity.java

    //全局变量
    private ListView listview;//Activity类中的onCreate()方法
    MyBaseAdapter myadapter = new MyBaseAdapter();
    listview.setAdapter(myadapter);//内部类MyBaseAdapter重写的getView(int position, View convertView, ViewGroup parent)方法
    View view = View.inflate(MainActivity.this, R.layout.list_item, null);
    TextView textview = (TextView)view.findViewById(R.id.item_tv);
    ImageView imageview = (ImageView)view.finViewById(R.id.item_iv);
    textview.setText(names[position]);
    imageview.setBackgroundResource(icons[position]);
    return view;//优化的getView方法和增加的ViewHolder内部类
    public view getView(int position, View convertView, ViewGroup parent){ViewHolder holder;if(convertView == null){convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.list_item, parent, flase);holder = new ViewHolder();holder.textview = (TextView)convertView.findViewById(R.id.item_tv);holder.imageview = (ImageView)convert.findViewById(R.id.item_iv);convertView.setTag(holder);}else{holder = (ViewHolder)convertView.getTag();}holder.textview.setText(names[position]);holder.imageview.setBackgroundResource(icons[position]);return converView;
    }class ViewHolder{TextView textview;ImageView imageview;
    }
    

第六章 BroadcastReceiver

  • 无序广播

    无序广播是完全异步执行的,所有监听这个广播的广播接收者都会接收到此广播消息,但是接收和执行的顺序是不确定的。无序广播效率最高,但是不可以被拦截。

  • 有序广播

    发送广播,MainActivity.java

    Intent intent = new Intent();
    intent.setAction("yuhaoWu");
    sendOrderedBroadcast(intent, null);
    

    添加广播接收者,MyBroadcastReceiverOne.java

    public class MyBroadcastReceiverOne extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent){Log.i("one", "1号已收到,over");}
    }
    

    设置优先级,AndroidManifest.xml

    <receiver android:name=".MyBroadcastReceiverOne"><intent-filter android:priority="1000"><action android:name="yuhaoWu" /></intent-filter>
    </receiver><receiver android:name=".MyBroadcastReceiverTwo"><intent-filter android:priority="10"><action android:name="yuhaoWu" /></intent-filter>
    </receiver><receiver android:name=".MyBroadcastReceiverThree"><intent-filter android:priority="100"><action android:name="yuhaoWu" /></intent-filter>
    </receiver>
    

    拦截,高优先级可以拦截低优先级的广播

    在广播接收者类的onReceive方法中调用abortBroadcast()方法即可拦截.

第七章 Services

服务的生命周期(简答-描述)

  • startService()启动方式

    当通过startService()方法启动服务时,执行的生命周期方法为onCreate()、onStartCommon(),然后服务处于运行状态,直到自身调用stopSelf()方法或其他组件调用stopService()方法时服务停止,最终被系统销毁。

    1. Call to startService()
    2. onCreate()
    3. onStartCommand()
    4. Service Running
    5. onDestroy()
    6. Service shut down
  • bindService()启动方式

    当使用bindService()方法启动服务时,执行的生命周期方法为onCreate()、onBind(),然后服务处于运行状态,直到调用unBindService()方法时,服务被解绑调用onUnBind()方法,最终被销毁。

    1. Call to bindService()
    2. onCreate()
    3. onBind()
    4. Client are bound to service
    5. onUnBind()
    6. onDestroy()
    7. Service shut down

第八章 ContentProvider

基本概念

ContentProvider(内容提供者)是Android系统四大组件之一,其功能是在不同的应用程序之间实现数据共享,它不仅允许一个程序访问另一个程序中的数据,同时还可以选择只对那一部分数据进行共享,从而保证了程序中的隐私数据不被泄露。

URI组成结构

如何调用ContentProvider?

通过Context中的getContentResovler()方法获取ContentResovler类的实例。

内容提供者的创建

创建MyContentProvider需要继承抽象类ContentProvider,重写它的一系列抽象方法。

onCreate()在ContentProvider创建时调用

增删改查四个方法

getType()方法用于返回指定URI代表的数据的MIME类型,如jpg、txt。

同时需要在AndroidManifest.xml文件注册

<providerandroid:name=".MyContentProvider"android:authorities="cn.itcast.mycontentprovider" android:enabled="true"android:exported="true" />

内容提供者的使用

Uri uri = Uri.parse("content://cn.itacast.mycontentprovider/person");  //authority需与上面manifest文件中注册的一样
ContentResovler resolver = context.getContentResovler();
Cursor cusor = resovler.query(uri, new String[]{name, price, sex}, null, null, null);
while(cursor.moveToNext()){String name = cursor.getString(0);int price = cursor.getInt(1);String sex = cursor.getString(2);
}

系统短信内容提供者的Uri为"content://sms/"

湖南某科技大学 安卓Android移动开发基础期中考试笔记(持续更新)相关推荐

  1. Android App开发基础

    Android App开发基础 App的开发特点 (1)App的运行环境 1.使用数据线把手机连到电脑上 2.在电脑上安装手机的驱动程序 3.打开手机的开发者选项并启用USB调试 4.将连接的手机设为 ...

  2. 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第二章:Android App 开发基础

    第 2 章 Android App开发基础 本章介绍基于Android系统的App开发常识,包括以下几个方面:App开发与其他软件开发有什么不一 样,App工程是怎样的组织结构又是怎样配置的,App开 ...

  3. android界面数据存储,Android应用开发基础之数据存储和界面展现(二)

    Android应用开发基础之数据存储和界面展现(二) 常见布局 相对布局 RelativeLayout 组件默认左对齐.顶部对齐 设置组件在指定组件的右边 android:layout_toRight ...

  4. android 启动服务同时传递数据,Android Studio开发基础之起动Service,并通过从Activity向Service传递数据...

    Android Studio开发基础之启动Service,并通过从Activity向Service传递数据 本实例演示启动Service,并通过从Activity向Service传递数据,新建一个Se ...

  5. Android视频开发基础

    Android视频开发基础 版权声明:本文为[viclee]原创,如需转载请注明出处~ https://blog.csdn.net/goodlixueyong/article/details/6205 ...

  6. 音视频开发(19)---Android视频开发基础(一)

    Android视频开发基础(一) 版权声明:本文为[viclee]原创,如需转载请注明出处~ https://blog.csdn.net/goodlixueyong/article/details/6 ...

  7. Android视频开发基础(二)

    Android视频开发基础(二) https://blog.csdn.net/goodlixueyong/article/details/62447452 前一篇文章详细介绍了视频的一些基本概念,这些 ...

  8. Android App开发基础篇—数据存储(SQLite数据库)

    Android App开发基础篇-数据存储(SQLite数据库) 前言:Android中提供了对SQLite数据库的支持.开发人员可以在应用中创建和操作自己的数据库来存储数据,并对数据进行操作. 一. ...

  9. 浅谈Android游戏开发基础和经验

    Android游戏开发基础和经验是本文要介绍的内容,主要是来了解并学习Android游戏开发的内容实例,具体关于Android游戏开发内容的详解来看本文. 做一个类似俄罗斯方块的android游戏开发 ...

最新文章

  1. java layout_java - 以编程方式在LinearLayout中设置边距
  2. # iOS 一窥并发编程底层(一)
  3. Java在一个文件中匹配字符串
  4. 大咖分享,带你洞悉畅销游戏背后的数字化运营落地实践
  5. javascript 之---正则表达式
  6. 《简明 Python 教程》笔记
  7. linux网络编程之网络字节序、主机字节序、大端、小端
  8. 微型计算机接口部件的结构,微机接口课后习题解析.doc
  9. Hive与数据库的异同
  10. BZOJ2535: [Noi2010]Plane 航空管制2(拓扑排序 贪心)
  11. json oracle 导入,JsonToOracle-Json导入Oracle工具下载 v2.0 官方版 - 安下载
  12. python time用法
  13. 5. 工业大数据典型应用
  14. 如何用 Python 提取韦小宝身份证信息
  15. Leetcode| 216. 组合总和III、17. 电话号码的字母组合 Day25
  16. 2021年年度总结(记录一下自己大学期间吧)
  17. 湖南中医药大学OJ—1140到1149
  18. youtobe和youtobeGo在不同国家码下的预置
  19. 100种思维模型之损失规避思维模型-008
  20. 操作系统——bilibili王道考研操作系统课程笔记

热门文章

  1. mysql如何清空表
  2. in_array()的那些坑
  3. PMCAFF外包大师长期招募兼职团队和个人
  4. IC卡,ID卡,HID卡外观和介绍
  5. 要怎么在计算机里清除桌面内存,电脑内存不足怎么办?怎么清理电脑内存?
  6. NRF52832开发:普通串口驱动
  7. unity中rectTransform的宽和高如何取
  8. WordPress博客网站屏蔽搜索特殊关键字和网址,屏蔽恶意特殊关键词的方法分享,附如何屏蔽搜索收录
  9. NTN(四) RRC related
  10. ZeroTier禁用直连----强制使用Moon