Stopped(停止):完全被另一个Activity覆盖
Destroyed(销毁):退出,完全销毁
4、Activity栈(先进后出)
多个Activity运行时,Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换。
5、启动Activity
1.简单启动
在AndroidManifest.xml中声明
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android=“http://schemas.android.com/apk/res/android”
package=“com.scc.demo”>
<application
android:allowBackup=“true”
android:icon=“@mipmap/ic_launcher”
android:label=“@string/app_name”
android:roundIcon=“@mipmap/ic_launcher_round”
android:supportsRtl=“true”
android:theme=“@style/Theme.Demo”>
<activity
android:name=“.actvitiy.MainActivity”>
在MainActivity.java中启动
Intent intent = new Intent(MainActivity.this,RedActivity.class);
startActivity(intent);
2.数据传递
2.1简单数据传递
MainActivity.class
Intent intent = new Intent(MainActivity.this,BlueActivity.class);
intent.putExtra(“scc”,“aiyouyou”);
startActivity(intent);
BlueActivity.class
Log.e(getClass().getName(),getIntent().getStringExtra(“scc”));
打印结果:aiyouyou
2.2复杂数据传递
2.2.1使用数据包Bundle
MainActivity.class
Intent intent = new Intent(MainActivity.this,BlueActivity.class);
Bundle bundle = new Bundle();
bundle.putString(“scc”,“heiha”);
bundle.putString(“size”,“18”);
intent.putExtras(bundle);
startActivity(intent);
BlueActivity.class
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
Log.e(getClass().getName(),bundle.getString(“scc”)+“:”+bundle.getString(“size”));
打印结果:heiha:18
2.2.2使用Serializable(序列化)
创建一个实体类User implements Serializable
MainActivity.class
Intent intent = new Intent(MainActivity.this,BlueActivity.class);
intent.putExtra(“user”,new User(“帅次”,“男”,20));
startActivity(intent);
BlueActivity.class
User user = (User)getIntent().getSerializableExtra(“user”);
Log.e(getClass().getName(),user.getName()+“:”+user.getGender()+user.getAge());
打印结果:帅次:男20
3.启动带返回值
启动的MainActivity.java
Intent intent = new Intent(MainActivity.this,BlueActivity.class);
intent.putExtra(“scc”,“俺来咧”);
startActivityForResult(intent,998);
Log.e(getClass().getName(),“startActivityForResult”);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.e(getClass().getName(),“requestCode:”+requestCode+“:resultCode:”+resultCode);
//启动ActivityCode值998,回传ActivitiyCode值500
if(requestCode998&&resultCode500){
Log.e(getClass().getName(),“Intent data:”+data.getStringExtra(“scc_result”));
}
}
被启动的BlueActvitiy.java
Log.e(getClass().getName(),getIntent().getStringExtra(“scc”));
btn_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e(getClass().getName(),“onClick.setResult”);
Intent intent = new Intent();
intent.putExtra(“scc_result”, “恕瑞玛你们的皇帝回来啦”);
setResult(500, intent);
finish();
}
});
打印结果:
点击MainActivity启动按钮
MainActivity$1: startActivityForResult
BlueActivity: 俺来咧
点击BlueActvitiy返回按钮
lueActivity$1: onClick.setResult
requestCode:998:resultCode:500
Intent data:恕瑞玛你们的皇帝回来啦
这就算完事了。
注意:requestCode不能等于resultCode,否则回传会失效。
6、Activity的启动模式(launchMode)
standard:每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈;
singleTop:如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;
singleTask:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶。并调用其onNewIntent();
singleInstance:应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例。
7、进程的优先级
1.前台进程(Foreground process)。它表明用户正在与该进程进行交互操作优先级是最高的。Android系统依据下面的条件来将一个进程标记为前台进程:
1.1、该进程持有一个用户正在与其交互的Activity(也就是这个activity的生命周期方法走到了onResume()方法)。
1.2、该进程持有一个正在执行生命周期方法(onCreate()、onStart()、onDestroy())的Service。
1.3、该进程持有一个正在执行onReceive()方法的BroadcastReceiver。
2.可见进程(Visible process)。它表明虽然该进程没有持有任何前台组件,但是它还是能够影响到用户看得到的界面。android系统依据下面的条件将一个进程标记为可见进程:
2.1、该进程持有一个非前台Activity,但这个Activity依然能被用户看到(也就是这个Activity调用了onPause()方法)。例如,当一个activity启动了一个对话框,这个activity就被对话框挡在后面。
1.2、该进程持有一个正在执行方法Service.startForeground()的Service。
3.服务进程(Service process)。除了符合前台进程和可见进程条件的Service,其它的Service都会被归类为服务进程。
4.后台进程(Background process)。持有不可见Activity(调用了onStop()方法)的进程即为后台进程。通常情况下都会有很多后台进程,当内存不足的时候,在所有的后台进程里面,会按照LRU(最近使用)规则,优先回收最长时间没有使用过的进程。
5.空进程(Empty process)。不持有任何活动组件的进程。保持这种进程只有一个目的,就是为了缓存,以便下一次启动该进程中的组件时能够更快响应。当资源紧张的时候,系统会平衡进程缓存和底层的内核缓存情况进行回收。
5.1.这些进程通常包含用户当前不可见的一个或多个Activity实例(onStop()方法已被调用并返回)。
8、scheme跳转协议
1.android中的scheme是一种页面内跳转协议,通过定义自己的scheme协议,可以跳转到app中的各个页面
2.服务器可以定制化告诉app跳转哪个页面
3.App可以通过跳转到另一个App页面
4.可以通过H5页面跳转页面
实现方式:
1.在AndroidManifest.xml中对activity标签增加intent-filter设置Schema
<activity android:name=“com.scc.demo.actvitiy.RedActivity”
<data
android:host=“scc”
android:path=“/redActivity”
android:port=“2021”
android:scheme=“sccdemo” />
2.调用
2.1、在html中调用
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
架构师筑基包括哪些内容
我花了将近半个月时间将:深入 Java 泛型.、注解深入浅出、并发编程.、数据传输与序列化、Java 虚拟机原理、反射与类加载、高效 IO、Kotlin项目实战等等Android架构师筑基必备技能整合成了一套系统知识笔记PDF,相信看完这份文档,你将会对这些Android架构师筑基必备技能有着更深入、更系统的理解。
由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容
注:资料与上面思维导图一起看会更容易学习哦!每个点每个细节分支,都有对应的目录内容与知识点!
这份资料就包含了所有Android初级架构师所需的所有知识!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
84275)]
架构师筑基包括哪些内容
我花了将近半个月时间将:深入 Java 泛型.、注解深入浅出、并发编程.、数据传输与序列化、Java 虚拟机原理、反射与类加载、高效 IO、Kotlin项目实战等等Android架构师筑基必备技能整合成了一套系统知识笔记PDF,相信看完这份文档,你将会对这些Android架构师筑基必备技能有着更深入、更系统的理解。
由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容
注:资料与上面思维导图一起看会更容易学习哦!每个点每个细节分支,都有对应的目录内容与知识点!
[外链图片转存中…(img-eau8K1vJ-1713771384276)]
[外链图片转存中…(img-qgRmNWfY-1713771384277)]
这份资料就包含了所有Android初级架构师所需的所有知识!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!