客户端基础知识必备上课笔记 | 青训营笔记

96 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第1天

1.Android基础组件

1.1 界面组件

1.1.1 Activity

Activity是一个应用程序组件,提供一个屏幕,用户可以用Activity进行前台交互。也可以作为一个Android程序的入口。在一个Android应用当中,一个Activity一般是一个单独的屏幕,上面可以显示并对用户的事件做出响应。

Activity的基本用法
  1. 先在AndroidMainfest.xml中注册
<manifest ... >
  <application ... >
      <activity 
    			android:name=".FirstActivity"
    			android:label="This is first activity"
    			android:launchMode="singleTop" >            
    			<intent-filter>
              <!--让FirstActivity作为程序的主活动-->
        			<action android:name="android.intent.action.MAIN"/> 
        			<category android:name="android.intent.category.LAUNCHER"/>
   			  </intent-filter>
			</activity>
      ...
  </application ... >
  ...
</manifest >
  1. 声明一个布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android-"http://schemas. android. com/apk/res/android"
		android:orientation="vertical" android: layout_width="match_parent"
		android:layout_height="match-parent”>
		<GridView
				android:id="@+id/album_grid"
				android:layout-width=" match_parent"
				android: Layout_height="wrap_content"
				android: numCoLumns="auto_fit"
				android:verticalSpacing-"10dp"
				android:gravity="center"
				android:horizontalSpacing="10dp"/>
</LinearLayout>
  1. 绑定Activity 重写onCreate方法
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
  1. 启动
Intent intent = new Intent(MyActivity.this, MyOtherActivity.class);
startActivity(intent);
Activity的生命周期

onCreate():Activity创建时候调用。生命周期第一个方法,一般做一些初始化操作 onStart():表示Activity正在启动,当前Activity处于可见状态,即将进入前台 onResume():表示Activity已经可以编辑,Activity处于可交互状态 onRestart():一个未被销毁的Activity重新显示出来时候回回调这个方法。一般是调用顺序会是:onRestart()->onStart()->onResume() onPause():当Activity失去焦点(不可编辑)时调用,一般情况下onStop方法会紧接着被回调 onStop():一般在onPause方法执行完成直接执行,表示Activity即将停止或者完全被覆盖,此时Activity不可见,仅在后台运行 onDestory():Activity正在被销毁,也是生命周期的最后一个方法 onNewInstent():非默认模式时,启动一个已存在的Activity时候,会先调用这个方法。需要在此方法中更新intent,否则getIntent()会一直获取旧的intent

onSaveInstanceState():在非正常关闭时回调,用于保存数据,不支持持久化数据

onRestoreInstanceState():用于恢复数据

Activity启动模式

standard:默认模式,允许重复

singleTop:栈顶复用,不允许连续重复

singleTask:栈内复用,不允许同个栈内重复

singleInstance:全局复用,整个系统不允许重复

1.1.2 Fragment

Fragment的设计初衷是适应大屏幕的平板电脑,类似于一个小型的Activity。他可以把屏幕分成几块,然后进行分组,进行一个模块化的管理。Fragment并不能单独使用,他需要嵌套在Activity 中使用,尽管他拥有自己的生命周期,但是还是会受到宿主Activity的生命周期的影响。

Fragment生命周期

来源:runoob.com

img

Fragment与Activity交互
获取Fragment组件
  1. Fragment获取Activity中的组件getActivity().findViewById(R.id.xxx)
  2. Activity获取Fragment中的组件getFragmentManger.findFragmentById(R.id.fragment_xxx)
Fragment的数据传递
  1. Activity传数据给Fragment:setArguments(Bundle bundle)

  2. Fragment传数据给Activity:

    a. 通过对象直接传递(方法调用/接口调用)

    b. 通过viewmodel/handler/broadcast/eventbus等通信

1.2 服务组件

1.2.1 Service

Service服务是一个应用程序组件,不会创建自己的线程,也不提供用户界面。

Service的基本用法
  1. 先在AndroidMainfest.xml中注册
<application
    <service
        android:name=".MyService"
				<!--是否启用这个Service-->
        android:enabled="true"
				<!--是否允许除当前程序之外的其他程序访问次Service-->
        android:exported="true"></service>     
</application>
  1. 创建相关的Service类
public class MyService extends Service {
  //此处重写Service的生命周期
}
  1. 加载Service
startService()
bindService()
Service的生命周期

img

1.3 广播组件

1.3.1 Broadcast

Broadcast的基本用法
静态广播

先在AndroidMainfest.xml注册

<receiver android:name=".ui.broadcast.MyReceiver"
          android:enabled="true"
          android:exported="true">
    <intent-filter>
        <!-- 例如:接收系统开机广播 -->
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <!-- 例如:接收自定义的广播 -->
        <action android:name="com.jeanboy.broadcast.MyReceiverFilter" />
    </intent-filter>
</receiver>
动态广播

动态广播不需要在AndroidMainfest.xml注册,直接在代码中注册即可

// 创建广播
MyReceiver myReceiver = new MyReceiver();
// 创建 IntentFilter
IntentFilter intentFilter = new IntentFilter();
// 例如:添加系统广播 action 接受网络变化
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
// 例如:添加自定义的 action
intentFilter.addAction(MyReceiver.ACTION);
// 注册广播
registerReceiver(myReceiver, intentFilter);
// 注销广播
unregisterReceiver(myReceiver);
发送广播

静态广播和动态广播都用如下方式发送广播

// 创建 Intent
Intent intent = new Intent();
// 例如:添加自定义的 action
intent.setAction(MyReceiver.ACTION);
// 发送广播
sendBroadcast(intent);

参考资料:developer.android.com/guide/compo…

1.4 数据组件

1.4.1 Intent

Intent是对要执行的操作的抽象描述。它可用于startActivity启动ActivitybroadcastIntent将其发送到任何感兴趣的BroadcastReceiver组件。

Intent的基本用法
直接Intent
public class IntentActivity extends Activity {

    public void intentTest() {
        //创建一个Intent对象
        Intent intent = new Intent();
        //指定Intent对象的目标组件是SecondActivity
        intent.setClass(IntentActivity.this, SecondActivity.class);
    }
间接Intent

AndroidMainfest.xml注册

				<!--Activity配置-->
        <activity android:name=".FirstActivity"
            android:label="My Application">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
								<!--应用程序入口-->
                <category android:name="android.intent.category.LAUNCHER" />
                <!--该活动优先级最高-->
        </intent-filter>
        </activity>
Intent的系统能力

电话:Intent(Intent.ACTION_DIAL, Uri.parse("tel:10010")) 短信:Intent(lntent.ACTION_SENDTO, Uri.parse("smsto:10010")) 网页:Intent(Intent.ACTION VIEW, Uri.parse("www.baidu.com")) 邮件:Intent(lntent.ACTION_SENDTO, Uri.parse("mailto:someone@domain.com”")) 地图:Intent(lntent.ACTION_VEW, Uri.parse("geo:39.9,116.3") 拍照:Intent(MediaStore.ACTION IMAGECAPTURE) 设置:Intent(android.provider.Settings.ACTION_SETT 市场:Intent(Intent.ACTION_VIEW, Uri.parse("market:packageName))

2.Android通信组件

2.1.1 Handler

Handler的基本用法

  1. 实现handleMessage()
  2. 构造Message
  3. 子线程调用Handler.sendMessage()发送Message
  4. 在Handler的handleMessage(Message msg)主线程更新UI

2.2.1 Binder

Binder的基本用法

服务端
  1. 定义一个AIDL文件
  2. 实现描述的接口,编写Service
客户端
  1. 拿到AIDL文件
  2. 绑定服务,获得接口持有对象