活动之 显式隐式Intent,生命周期,启动模式

前言

学习了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 将当前活动设为主活动

加载布局

在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();
}

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");

ShardePreferences存储

返回数据给上一个活动

活动的生命周期

返回栈

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来启动活动,传递数据,活动的生命周期,活动的启用方法,若在浏览时,给您带来不便,敬请斧正~谢谢您的观看♥

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

blog....

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值