目录
前言
学习了Android一段时间后,重看活动,可能不像自己其他博客知识点那么详细,但是也会多一些理解和拓展,也是一种不一样的视角
活动是什么
用于与用户间的交互,一个界面可含零或多个活动
活动的基本用法
- 重写onCreate()
setContentView
给当前活动加载布局
public class FirstActivity extends AppCompatActivity{
protected void onCreate(Bundle savedInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.first_layout);
//项目中任何资源都会在R文件中生成一个资源id
//得到first_layout.xml布局的id
}
}
创建活动
- Generate LayoutFile 自动生成布局
- Launcher Activity 将当前活动设为主活动
加载布局
- 发生在生命周期的 onCreate()阶段
- id 当前元素的唯一标识符 , 我们也将学到另一个标识符
内容提供器唯一标识符Uri
在AndroidManifest文件中注册
- 注册声明放在 < application> 中,通过< activity>进行注册
- android:label 应用程序/标题栏 名称
在活动中使用Toast
-
findViewById 获取布局文件定义的元素
-
记得写上Toast方法上的show(),不然显示不出来,
新手的我当时就犯错了
//findViewById返回View对象,将其向下转型成Button
Button button=(Button)findViewById(R.id.button1);
//注册监听器
button.setOnClickListener(new View.OnClickListener(){
//执行监听器中的onClick方法
public void onClick(View v){
Toast.makeText(MainActivity.this,"哎呀你长得真好看",Toast.LENGTH_SHORT).show();
}
})
销毁一个活动
public void onClick(){
finish();
}
- onDestory和finish区别
- onDestory是活动一个生命周期的方法,销毁内存空间
- finish用于结束一个活动的生命周期,出栈,back键不会再找到这个活动
Intent在活动中穿梭
Intent的作用
intent 译为意图,表示 当前组件要执行的动作,或是带着组件的意图传播,是各组件交互的一种重要方式,用于启动活动,启动服务,发送广播
显式Intent
- 启动方向明确,意为显式
//第一个参数提供上下文,第二个参数意为 要启用的活动
Intent intent=new Intent(MainActivity.this,SecActivity.class);
startActivity(intent);
隐式Intent
- 未知具体启动哪个活动,给出指定信息,由系统自动匹配活动
//AndroidManifest.xml
//只有当action和category同时匹配,活动才能响应intent
//一个intent只能有一个action,可有多个category
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
//默认目录,不需要指定category
<catrgory android:name="android.intent.category.DEFAULT">
<catrgory android:name="android.intent.category.MT_CATEGORY">
<intent-fliter>
//MainActivity
Intent intnet=new Intent("com.example.activitytest.ACTION_START");
intent.addCategory("android.intent.category.MT_CATEGORY");
更多隐式用法
- 打开网页
//指定intent的action
Intent intent=new Intent(Intent.ACTION_VIEW);
//将网址解析为Uri对象,被setData接收
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
//在AndroidManifest中进一步指定活动响应的数据类型
<action android:name="android.intent.action.VIEW"/>
<data android:scheme="http"/>
- < data >标签还可以配置下面内容
android:scheme 数据协议,eg,http,tel,geo(定位)
//tel的实例可见下文连接,申请拨打电话权限
android:host 指定数据主机
android:port 指定数据端口
android:path 指定主机名和端口名之后的部分,eg,网址域名后的部分
android:mimeType 指定可以处理的数据类型,运行使用通配符指定
向另一个活动传递数据
//MainActivity
Intent intent=new Intent(MainActivity.this,secActivity.class);
intent.putExtra("extra_data",data);
//键值对储存,这是ShareredPreferences存储方式,具体链接可见下文
...
startActivity(intent);
//secActivity
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");
返回数据给上一个活动
- startActivityForResult(intent,唯一数值即可)
返回数据实例–建调用相册和摄像头
活动的生命周期
返回栈
Android通过Task来管理活动,一个Task即一组存放在栈中活动的集合,这个栈称为返回栈,返回back键或者调用finish,出栈,系统将下一个栈顶活动提供给用户
活动状态
- onCreate 加载布局,绑定事件
- onStart 活动由不可见,变为可见
- onResume 准备与用户交互前调用,活动在栈顶,处于运行状态
- onPause 准备恢复或调用另一个文件
- onStop 由可见变为不可见
- onDestory 销毁之前调用
- onRestart 在onStop后可调用
更具体内容可见-- 转载博客 Activity
home和back键区别
活动生存期
- 类比碎片
碎片
碎片区别于活动生命周期:
onDatch 碎片和活动解除关联
onDestoryView 移除与碎片相关视图
-
完整生存期
onCreate onDestory -
可见生存期
onStart onStop
活动对用户可见,有可能无法与用户交互 -
前台生存期
onResume onPause
活动处于运行状态,可以与用户进行交互
活动启动模式
standard
在不进行显示指定情况下,活动都用的启动模式
singleTop
检查要启用的活动是否在栈顶,否则新建实例
android:launchMode="singleTop"
<intent-filter>
...
singleTask
检查要启用的活动是否在栈中,存在直接使用,并把所有在这活动之上的活动出栈
android:launchMode="singleTask"
<intent-filter>
...
singleInstance
每个应用程序都有自己得到返回栈,为了避免一个活动被多个应用程序调用时,在不同的栈内创建实例,对于这样的活动单设了一个栈,不同应用程序都从这个栈内调用
android:launchMode="singleInstance"
<intent-filter>
...
随时随地退出程序
//建一个活动管理器
public class ActivityCollector{
//通过一个列表来暂存活动,并对活动进行 移除,删掉最后残留
public static List<Activity> activities=new ArrayList<>();
public static void addActivity(Activity activity){
activities.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for(Activity activity:activities){.
if(!activity.isFinishing()){
activity.finish();
}
}
}
}
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
ActivityCollector.addActivity(this);//调用AC的增加活动方法
}
protected void onDestory(){
super.onDestory();
//将一个马上要销毁的活动从管理器中移除
ActivityCollector.removeActivity(this);
}
- 应用
//有了上面的基础操作之后,我们便可以随时随地关掉程序了:
Button btn1=(Button)findViewById(R.id.btn_close);
btn1.setOnClickListener(new OnClickListener(){
public void onClick(View v){
ActivityCollector.finishAll();
//加载每一个活动,已自动加入list,在
//销毁前自动移除管理器,我们只需调用finishAll即可
}
});
启动活动的最佳写法
//secondActivity
public class void actionStart(Context context,String data1,String data2){
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("data1",dataOne);
intent.putExtra("data2",dataTwo);
startActivity(intent);
}
//FirActivity
//这样做的好处在于:清晰知道要传递哪些数据,简化启动代码
btn_data.setOnClickListener(new onClickListener(){
public void onClick(View v){
SecondActivity.actionStart(FirActivity.this,"data1","data2");
}
})
这篇博客浅谈了活动基本用法,用intent来启动活动,传递数据,活动的生命周期,活动的启用方法,若在浏览时,给您带来不便,敬请斧正~谢谢您的观看♥