安卓 Activity
Activity总结基础部分
/*---------------------------------------- *-描述--Activity相关内容总结. *-描述--S1.Activity的7个生命周期 * ☆☆☆☆☆单独活动生命周期: * 1.Activity创建的时候:onCreate() => onStart() => onResume() * 2.按下home键或进入其他活动(失去焦点):onPause() => onStop() * 3.再进入(重获取焦点):onRestart() => onStart() => onResume() * 4.退出:onPause() => onStop() => onDestroy() * 5.弹出对话框(失去焦点):没走生命周期? * 6.横竖屏切换:横 => 竖或反过来 * 重走生命周期onPause() => onStop() => onDestroy() ... onResume() * 7.设置横竖屏却换不走生命周期:Activity注册列表中添加属性 * android:configChanges="keyboardHidden|orientation|screenSize" * ☆☆☆☆活动的7个生命周期描述: * -1. void onCreate(Bundle savedInstanceState) Activity被创建的时候 * -2. void onStart() activity变为在屏幕上对用户可见时调用。 * -3. void onResume() activity开始与用户交互时调用(无论是启动还是重新启动一个 * 活动,该方法总是被调用的)。 * -4. void onPause() activity被暂停时调用,该方法用于保存活动状态的,也是保护现场,压栈等 * -5. void onStop() activity被停止并转为不可见阶段及后续的生命周期事件时调用。 * -6. void onRestart() 重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。 * -7. void onDestroy() activity被完全从系统内存中移除时调用,该方法被调用可能是 * 因为有人直接调用onFinish()方法或者系统决定停止该活动以释放资源 * ☆其他相关方法 * -1.窗口焦点变化 onWindowFocusChanged(boolean hasFocus) * -2.当系统资源不足而销毁活动时,会把View的状态信息保存到Bundle savedInstanceState * 重新创建时又把参数加载出来,可以用于屏幕方向旋转时数据保存等操作 * onCreate(Bundle savedInstanceState) * onSaveInstanceState(Bundle outState) * onRestoreInstanceState(Bundle savedInstanceState) * 参考: * http://blog.csdn.net/shulianghan/article/details/38297083 * http://blog.sina.com.cn/s/blog_618199e60101g1k5.html *-描述--S2.传值与跳转 * ☆☆活动的注册:设置name的属性为包名+类名 * -1.<activity android:name=".basic.dir.basic1.ModxBasic1Activity"/> * -2.label属性:值是Activity显示的标题 android:label="ModxBasic1Activity" * ☆☆Activity的跳转: * -1.从桌面图标到APP的跳转 * <intent-filter> * <action android:name="android.intent.action.MAIN" /> * <category android:name="android.intent.category.LAUNCHER" /> * </intent-filter> * -2.显示意图 直接跳转到该APP的下一个活动 * Intent intent = new Intent(BActivity.this, CActivity.class); * startActivity(intent); * -3.隐式意图 使用一个意图跳转到两个已经配置了该意图的应用 * Intent intent = new Intent("com.example.activity"); * startActivity(intent); * !!需注册 * <intent-filter> * <action android:name="com.example.activity" /> * <category android:name="android.intent.category.DEFAULT" /> * </intent-filter> * ☆☆☆Activity的传值方式 * -1.在Intent 对象中,可以放入各种数据类型 * value值可以是基本数据类型及字符串、Bundle对象、实现Serializable接口或Parcelable接口的对象 * intent还封装了一些传送数组、ArrayList集合的方法 * intent.putExtra("key", value) * -2.创建一个Bundle(数据包)对象,然后调用Bundle对象的put方法来来存入数据, * 最后把Bundle对象存入Intent中 * !!bundle对象可以理解成一个Map键值对 * bundle传送的数据类型与intent相同,但bundle封装了更多方法 * -3.startActivityForResult()传值是前后两个活动的数据交换 * A活动启动下一个活动并加上一个请求码,B收到请求码通过intent把数据回传,并结束B活动, * 完成数据的交互。使用相对局限、麻烦 * A startActivityForResult(intent,requestCode); * onActivityResult(int requestCode, int resultCode, Intent data) * B setResult(resultCode,intent) 返回数据 * finish() * -4.使用全局对象Application * 1).MyApplication extends Application; * 2).<application android:name=".MyApplication" manifest设置属性 * 3).getApplication获取Application对象,强转MyApplication,获取变量 * 强转MyApplication.XXX * -5.第三方封装工具eventBus *-描述--S3.扩展 * ☆☆☆活动与Fragment的生命周期: * ☆☆☆活动与Service的生命周期: * ☆☆☆活动的生命周期与View绘制方法: *-描述--S4.Activity的启动模式 * <!-- android:launchMode="singleTop" 处于栈顶时不重新创建 --> * <!-- android:launchMode="singleInstance" 所在任务栈中,只有自己一个实例 --> * <!-- android:launchMode="singleTask" 不重新创建,但会清除位于其上的任务 --> * <!-- android:launchMode="standard" 每次跳转重新创建 --> *-描述--None. *-描述--B1.None. *---------------------------------------------------------------------------*/ |
Activity常用设置
Q1.设置Activity全屏/状态栏-导航栏透明
Activity全屏@link
/*set it to be no title*/
requestWindowFeature(Window.FEATURE_NO_TITLE);
/*set it to be full screen*/
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// manifest节点设置
android:theme=" @android :style/Theme.NoTitleBar.Fullscreen"
状态栏-导航栏背景透明@link
// 隐藏标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); View root = LayoutInflater.from(this).inflate(R.layout.activity_main, null); // 或者 在界面的根层加入 android:fitsSystemWindows=”true” // 这个属性,这样就可以让内容界面从 状态栏 下方开始。 ViewCompat.setFitsSystemWindows(root, true); setContentView(root); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // Android 5.0 以上 全透明 Window window = getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); // 状态栏(以上几行代码必须,参考setStatusBarColor|setNavigationBarColor方法源码) window.setStatusBarColor(Color.TRANSPARENT); // 虚拟导航键 window.setNavigationBarColor(Color.TRANSPARENT); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // Android 4.4 以上 半透明 Window window = getWindow(); // 状态栏 window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // 虚拟导航键 window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } |
隐藏导航栏
// 1.方式1 /** * * @param activity * @param */ public static void setNavigationBar(Activity activity,int visible){ View decorView = activity.getWindow().getDecorView(); //显示NavigationBar if (View.GONE == visible){ int option = SYSTEM_UI_FLAG_HIDE_NAVIGATION; decorView.setSystemUiVisibility(option); } } |
REF:
Q2.Activity设置屏幕常亮
设置方法
// 1.方式1 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) |
REF:
Q3.Activity主题设置
s1.Android5.0+主题颜色定义
colorPrimaryDark 状态栏颜色
colorPrimary 标题栏颜色
colorAccent radioButton等背景色
// <style name="ColorTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- toolbar color --> <item name="colorPrimary">@color/green</item> <!-- status bar color --> <item name="colorPrimaryDark">@color/red</item> <!-- edittext line color --> <item name="colorAccent">@color/blue</item> // 兼容AIP19-20 /** * Set status bar color */ private void setStatusBarColor(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); ViewGroup decorViewGroup = (ViewGroup) window.getDecorView(); View statusBarView = new View(window.getContext()); int statusBarHeight = getStatusBarHeight(window.getContext()); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, statusBarHeight); params.gravity = Gravity.TOP; statusBarView.setLayoutParams(params); int color = ContextCompat.getColor(this, R.color.colorPrimaryDark); statusBarView.setBackgroundColor(color); decorViewGroup.addView(statusBarView);
ViewGroup mContentView = (ViewGroup) window.findViewById(Window.ID_ANDROID_CONTENT); View mChildView = mContentView.getChildAt(0); if (mChildView != null) { //注意不是设置 ContentView 的 FitsSystemWindows, 而是设置 ContentView 的第一个子 View . // 预留出系统 View 的空间. mChildView.setFitsSystemWindows(true); } } }
/** * GET status bar height * @param context * @return */ private static int getStatusBarHeight(Context context) { int statusBarHeight = 0; Resources res = context.getResources(); int resourceId = res.getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { statusBarHeight = res.getDimensionPixelSize(resourceId); } return statusBarHeight; } // 设置状态栏颜色-使用框架 compile 'com.githang:status-bar-compat:latest.integration' StatusBarCompat.setStatusBarColor(this, color, lightStatusBar); |
APP启动时黑屏或者白屏的解决办法
// 1.主题背景设置透明 <item name="android:windowBackground">@color/transparent_color</item> // 2.主题背景设置为启动图片
|
REF:
Andriod中Style/Theme原理以及Activity界面文件选取过程浅析
Q4.PreferenceActivity
PreferenceActivity UI组件
CheckBoxPreference |
单选框 |
|
SwitchPreference |
开关选项 |
|
EditTextPreference |
文本输入框选项 |
|
RingtonePreference |
铃声选项 |
|
ListPreference |
列表框 |
|
MultiSelectListPreference |
复选列表框 |
|
PreferenceCategory |
组合框 |
|
基本属性与方法:
公有属性: android:defaultValue="false" // 默认值 android:key="check_box_preference_1" // 相当于ID android:title="Check box preference" // 标题 android:summary="aaa" // 概述 android:persistent="true" // 表示Preference元素所对应的值是否写入sharedPreferen文件中 android:dependency="check_box_preference_0" // 表示一个Preference(用A表示)的可用状态依赖另外一个Preference(用B表示) |
ListPreference/MultiSelectListPreference: android:entries="@array/list_preference_entries" // 列表内容 android:entryValues="@array/list_preference_entries" // 列表内容对应值 事件: // 设置改变事件 checkBoxPreference1.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { LogUtils.e(newValue.toString()); return true; } }); // 基本方法 listPreference1.setSummary("str"); listPreference1.getSummary(); listPreference1.setValue(""); listPreference1.getValue(); listPreference1.setEntries(); listPreference1.getEntry(); listPreference1.setEntryValues(); listPreference1.getEntryValues(); listPreference1.setTitle(); listPreference1.getTitle(); listPreference1.setIcon(); listPreference1.getIcon(); // 点击事件 checkBoxPreference1.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { return true; } }); |
其他方法
// SharedPreferences设置变化 SharedPreferences.registerOnSharedPreferenceChangeListener(listener); |
新API
版本高于Android 3.0(API 10),可以在普通的Activity中使用PreferenceFragment来显示,也可以使用PreferenceActivity。link
参考:
PreferenceActivity developer.android
Android之PreferenceActivity 基本使用
Android中Preference的使用以及监听事件分析 API分析
Android实战技巧之六:PreferenceActivity使用详解 简例
Q5.Activity 在最近项目列表中不可见
其他方法
// 设置APP切换到后台在最近项目中不可见 link android:excludeFromRecents="true" |
REF: