一、Activity是什么?
Activity是Android应用中最基础、最重要的应用组件,类似于Servlet与Web应用的作用,在Activity中实现视图操作,数据绑定等交互动作。
开发中,Activity有衍生出更多的子类,但在实际开发中用的还是比较少
20140210163838453.png
二、Activity的生命周期
(一)、正常生命周期
activity_lifecycle.png对于各个生命周期的方法都有实际的使用,比如
开发地图功能就需要对应周期的管理,释放资源在onDestroy等。
(二)、异常生命周期
- onSaveinstanceState
保存 Activity 状态
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
- onRestoreInstanceState
恢复 Activity 状态
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
// Probably initialize members with default values for a new instance
}
...
}
(三)、一些特殊情况下的生命周期分析
- Activity 横竖屏切换https://blog.csdn.net/gdutxiaoxu/article/details/62235974
- 什么时候Activity单独走onPause()而不走onStop()
有在从该Activity跳到另一个透明或者半透明的Activity的时候才调用 - 3.什么情况导致Activity的onDestory()不执行
在activity 完成finish();才执行onDestory(),因此有时候需要用isFinishing()判断完成状态
三、Activity的四种形态(与生命周期区分开)
activie-->pause-->stopped-->killed
- activie:用户可见,可以获取焦点,可以进行交互动作
- pause:用户可见,但不能获取焦点,不可以与进行交互动作
- stopped:activity停止活动,不可见,失去焦点
- killed:activity进程结束
四、Activity的启动模式
1.任务栈
任务是一个Activity的集合,它使用栈的方式来管理其中的Activity,这个栈又被称为返回栈(back stack);
2.为什么需要加载模式
因为Android没有提供Task提供API,无法对Task进行管理,因此添加加载模式有效控制Activity与Task之间的加载关系
3.启动模式的种类和特性
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0520/2897.html
- stantard模式:多次点击会启动多个Activity
- singleTop模式:如果已存在栈顶的Activity实例,则复用,否则创建
- singleTask模式:如果不存在则创建Activity并放在同一任务的栈顶(使用taskAffinity参数则放入新的Task中),存在位于栈顶则类似singleTop模式,存在不位于栈顶则移除Task上面的所有Activity知道位于栈顶
- singleInstance模式:不存在则先创建一个全新Task,在创建目标实例,添加入栈顶,存在无论位于那个Task中那个应用程序中,将所在的TASK转到前台,显示目标实例。区别在于持有这个Activity的任务中只能有一个Activity:即这个单例本身。
五、Activity组件之间的通信
1.Activity与Activity之间通讯
- Intent/Bundle,携带更多的数据可以用bundle
// 创建用于封装数据的Bundle对象
Bundle bundle = new Bundle();
bundle.putString("name", "WangJie");
bundle.putInt("age", 23);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
//将Bundle对象嵌入Intent中
intent.putExtras(bundle);
startActivity(intent);
- 类的静态变量
public class Final {
public static final int REQUEST_SPOT_FRAGMENT = 9000, RESULT_SPOT_FRAGMENT = 9001;
public static final int REQUEST_SPOT_ACTIVITY = 1000, RESULT_SPOT_ACTIVITY = 1001;
public final static int REQUEST_GUIDE_ACTIVITY = 2000, RESULT_GUIDE_ACTIVITY = 2001;
}
- 全局变量(在Application中定义的变量)
public class App extends MultiDexApplication {
/**
* 本类实例
*/
private static App app;
private static RefWatcher refWatcher;
private ThreadFactory threadFactory;
private ExecutorService executorService;
}
2.Activity与Service之间通讯
- 绑定服务,利用ServiceConnection类
/**第一步Service中创建内部类
* 返回对象给Activity
*/
public class LocalBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
/**第二步Service中返回内部类
* service 回调对对象
* @param intent
* @return
*/
@Override
public IBinder onBind(Intent intent) {
LogUtil.d(TAG, "onBind");
return new LocalBinder();
}
/** 第三步
* 服务绑定状态监听
*/
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
LogUtil.d(TAG, "onServiceConnected");
try {
localBinder = (MyService.LocalBinder) service;
localBinder.getService().onLogin();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
LogUtil.d(TAG, "onServiceDisconnected");
}
};
// 第四步
// 启动后台服务接受一些 请求帮助、显示周围救助等的后台服务
Intent intent = new Intent(this, MyService.class);
intent.setPackage(this.getPackageName());
bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);
- Intent(通过意图携带数据)
- CallBack + Handler,监听Service进程的变化
通过在service中创建handler,(在那创建在哪个线程中处理),在主页面中通过onBind 中service 调用
3.Activity与Fragment之间通讯
- Fragment获取它所在的Activity,通过getActivity()强制转换调用Activity中的方法。
((HomeActivity) context).onStartProgress();
((HomeActivity) context).onStopProgressError();
- Activity获取它所包含的Fragment信息
// Activity中
getSupportFragmentManager().beginTransaction().add(R.id.flSpotChat, spotChatFragment).commit()
// Fragment嵌套
getChildFragmentManager().beginTransaction().add(R.id.flRescueChat, rescueChatFragment).commitAllowingStateLoss();
- Activity想Fragment中添传递数据
setArguments(Bundle bundle) - Fragment中定义内部回调接口,Activity中注册
public interface OnSosWhoCheckListener {
/**
* 3:为自己呼救 1.为其他人呼救
*
* @param sosWho
*/
void onCheck(String sosWho);
}
private OnSosWhoCheckListener onSosWhoCheckListener;
public SpotSosDialogFragment setOnSosWhoCheckListener(OnSosWhoCheckListener onSosWhoCheckListener) {
this.onSosWhoCheckListener = onSosWhoCheckListener;
return this;
}
spotSosDialogFragment = new SpotSosDialogFragment()
.setBundle(bundle)
.setOnSosWhoCheckListener(sosWho -> {
SpotFragment.this.sosWho = sosWho;
SpotFragment.this.sosType = "1";
}).setOnContractListener(contractors -> {
SpotFragment.this.contractors = contractors;
SpotFragment.this.sosType = "2";
});
4.scheme跳转协议
https://blog.csdn.net/lishuiyuntian/article/details/77477756
<activity android:name=".SchemeActivity">
<!-- 给页面添加指定的过滤器-->
<intent-filter>
<!--该页面的路径配置-->
<data
android:host="test"
android:path="/goods"
android:port="8080"
android:scheme="qh"/>
<!--下面这几行也必须得设置-->
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
网友评论