这是我参与「第四届青训营 」笔记创作活动的第1天
1.Android基础组件
1.1 界面组件
1.1.1 Activity
Activity是一个应用程序组件,提供一个屏幕,用户可以用Activity进行前台交互。也可以作为一个Android程序的入口。在一个Android应用当中,一个Activity一般是一个单独的屏幕,上面可以显示并对用户的事件做出响应。
Activity的基本用法
- 先在
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 >
- 声明一个布局文件
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>
- 绑定Activity 重写onCreate方法
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
- 启动
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
Fragment与Activity交互
获取Fragment组件
- Fragment获取Activity中的组件
getActivity().findViewById(R.id.xxx) - Activity获取Fragment中的组件
getFragmentManger.findFragmentById(R.id.fragment_xxx)
Fragment的数据传递
-
Activity传数据给Fragment:
setArguments(Bundle bundle) -
Fragment传数据给Activity:
a. 通过对象直接传递(方法调用/接口调用)
b. 通过viewmodel/handler/broadcast/eventbus等通信
1.2 服务组件
1.2.1 Service
Service服务是一个应用程序组件,不会创建自己的线程,也不提供用户界面。
Service的基本用法
- 先在
AndroidMainfest.xml中注册
<application
<service
android:name=".MyService"
<!--是否启用这个Service-->
android:enabled="true"
<!--是否允许除当前程序之外的其他程序访问次Service-->
android:exported="true"></service>
</application>
- 创建相关的Service类
public class MyService extends Service {
//此处重写Service的生命周期
}
- 加载Service
startService()
bindService()
Service的生命周期
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启动Activity, broadcastIntent将其发送到任何感兴趣的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的基本用法
- 实现handleMessage()
- 构造Message
- 子线程调用Handler.sendMessage()发送Message
- 在Handler的handleMessage(Message msg)主线程更新UI
2.2.1 Binder
Binder的基本用法
服务端
- 定义一个AIDL文件
- 实现描述的接口,编写Service
客户端
- 拿到AIDL文件
- 绑定服务,获得接口持有对象