目录:
1.Splash界面的写法
2.自定义Dialog去标题
3.Activity 声明周期之 onPause()
4.获取路径那些事
5.应用安装位置
6.显示应用选择器(打开外部Activity)
1.我不知道的Splash界面的写法
此种写法有一定局限性
以前写Splash界面都是直接建立一个SplashActivity,然后setContentView(R.layout.splash);
但是欢迎界面如果只是一个简单的图片就没有必要使用splash.xml布局了。
其实就是基础没学好
那就可以这样写:
//在Style里设置无标题栏、设置背景图片
<style name="SplashTheme" parent="Theme.AppCompat">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@mipmap/splash_backpng</item>//背景图片
</style>
//在清单文件中引入style
<activity
android:name=".splash"
android:theme="@style/SplashTheme">//引入
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
至于跳转,一般都是用动画、线程、Handler
2. 自定义Dialog去标题
在自定义Dialog时候,会出现一个空白标题,要去掉的话就要在创建自定义dialog时候加上一句话:
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
或者设置下主题样式
如:
MyDialog dialog = new MyDialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题
layout = inflater.inflate(R.layout.widget_main, null);
dialog.setContentView(layout);
<style name="dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item><!--边框-->
<item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
<item name="android:windowIsTranslucent">false</item><!--半透明-->
<item name="android:windowNoTitle">true</item><!--无标题-->
<item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->
<item name="android:backgroundDimEnabled">false</item><!--模糊-->
</style>
其实原理是一样的,都是主题样式和动态代码设定 来改变效果。
要注意的就是在自定义Dialog的构造器中主题样式一定要调用上(一个参数的构造器调用两个参数的构造器)
3. Activity 声明周期之 onPause()
在Training中,Google 不建议 在onPause()中执行耗时/消耗CUP的操作:
您应避免在onPause()期间执行CPU 密集型工作,比如向数据库写入信息,因为这会拖慢向下一 Activity 过渡的过程(您应改为在onStop()间执行高负载关机操作)
建议:
- 停止动画或其他正在进行的可能消耗 CPU 的操作。记住,从 Android7.0 开始,暂停的应用可能会在多窗口模式下运行。
- 提交未保存的更改,但仅当用户离开时希望永久性保存此类更改(比如电子邮件草稿)。
- 释放系统资源,比如广播接收器、传感器手柄(比如 GPS) 或当您的 Activity 暂停且用户不需要它们时仍然可能影响电池寿命的任何其他资源。
也就是说耗时全放到onStop()中,onPause()只能保留临时数据、进行不耗时操作(释放资源)
经过测试,Nexus6 页面跳转一般是30-50毫秒,如果在onPause中进行了耗时操作,可能会导致ANR。更别说界面跳转了 ~ (╯▽╰) ~
想做耗时操作就到onStop()里进行吧
当然了,在onStop()里进行特别耗时的,也会造成ANR,怎么造成呢? 比如:A界面跳转到B界面,点击跳转按钮,立刻再返回到A界面。就会ANR,因为A界面onStop()里有特别耗时的操作,这是少数情况。
4. 获取路径那些事
使用 getExternalFilesDir()和getExternalCacheDir() 方法获取的路径 ,是属于本应用的文件区域应用卸载后文件会被删除
使用getExternalStorageDirectory() 方法获取的路径,是属于SD卡里的公共区域,应用删除后数据仍保留。
使用getExternalStoragePublicDirectory() 方法获取的路径,是属于SD卡里的公共区域,其他应用也可以用同样的方法获取相应的目录,他可以获取手机中多个文件夹,如图。应用删除后数据仍保留(详情看代码)。
使用getFilesDir()和getCacheDir()方法获取的路径,都是在内部存储的路径。
getFilesDir():返回表示您的应用的内部目录的File。
getCacheDir():返回表示您的应用临时缓存文件的内部目录的File。务必删除所有不再需要的文件并对在指定时间您使用的内存量实现合理大小限制,比如,1MB。如果在系统即将耗尽存储,它会在不进行警告的情况下删除您的缓存文件。
注意:设置->应用->应用详情里面的”清除缓存“选项会清除 getExternalCacheDir()。而清除数据则会删除本应用的外部储存中的所有文件,也就是删除 /storage/emulated/0/Android/data/应用包名 中的所有文件,包括‘应用包名’这个文件夹!
//传入null则会返回根目录
getExternalFilesDir(null)//获取的是: /storage/emulated/0/Android/data/learn.com.learn/files
getExternalCacheDir()//获取的是: /storage/emulated/0/Android/data/learn.com.learn/cache
Environment.getExternalStorageDirectory()//获取的是:/storage/emulated/0
//获取的是我手机里的图片文件夹,
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)//路径是:/storage/emulated/0/Pictures
--------------下面是内部存储----------------
getFilesDir()//获取的是:/data/user/0/learn.com.learn/files
getCacheDir()//获取的是:/data/user/0/learn.com.learn/cache
5. 应用安装位置
在<manifest>标签中有一个 installLocation 属性,它是设置你应用安装位置的。
有三个值,分别是:
- auto 跟随手机设置自动匹配位置
- internalOnly 默认值 如果内存为空,则程序将不能安装(我们做开发时候经常能遇见安装失败,这个就是众多失败原因之一)
- preferExternal 优先安装到外部,用户可移动安装位置
如果安装在外部存储,则会丧失一下功能(直接看最后一条):
①Service
运行的Service将被杀死,当重新载入SD卡后将Service无法重新启动。
但是,注册ACTION_EXTERNAL_APPLICATIONS_AVAILABLE广播意图,这将通知您的应用程序,安装在外部存储应用已经成为提供给系统一次。
此时,就可以重新启动服务。
②Alarm Service
在AlarmManager中注册的报警将被取消。重新安装外部存储器时,必须手动重新注册任何报警。
③Input Method Engines
你的IME将由默认IME被替换。当外部存储设备重新安装时,用户可以打开系统设置再次启用IME。
④Live Wallpapers
运行的动态壁纸 将会被默认动态壁纸更换。当外部存储设备重新安装,用户可以重新选择动态壁纸。
⑤App Widgets
当外部存储设备重新安装的时候,您的应用程序窗口小部件会从主屏幕中移除。你的App的Widget将不能可供用户选择,直到系统重置家庭应用(通常直到重新启动系统完成)。
⑥Account Managers
与创建您的账户AccountManager将消失,直到外部存储设备重新装入。
⑦Sync Adapters
你的应用和 AbstractThreadedSyncAdapter和所有的同步功能将无法工作,直到外部存储设备重新装入。
⑧Device Administrators
我们的DeviceAdminReceiver将会失效
⑨监听开机结束事件
系统会在加载外部存储介质之前发送ACTION_BOOT_COMPLETED广播.因此安装在外部存储介质的程序将永远不能接收广播:ACTION_BOOT_COMPLETED
6.显示应用选择器(打开外部Activity)和查看外部Intent支持的Activity
①显示应用选择器(打开外部Activity)
在我们的程序内部想要打开一个外部Activity时候,比如 用浏览器打开一个网址,调用打电话界面等,一般会出现一个选择使用那个程序打开,这个选择界面也可以手动调出,代码如下。
主要方法是createChooser(Intent target, CharSequence title)
Uri webpage = Uri.parse("http://www.baidu.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
Intent chooser = Intent.createChooser(webIntent, "这里是选择框的描述语,按情况填写");
if (webIntent.resolveActivity(getPackageManager()) != null) {
startActivity(chooser);
}
②查看外部Intent支持的Activity
如果调用了 Intent,但设备上没有可用于处理 Intent 的应用,那么应用将崩溃。所以有些情况要加一些判断。
要确认是否存在可响应 Intent 的可用 Activity,请调用queryIntentActivities()来获取能够处理Intent的 Activity 列表。如果返回的List不为空,可以安全地使用该 Intent。例如:
PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;
如果 isIntentSafe 是 true,则至少有一个应用将响应该 Intent。 如果它是 false,则没有任何应用处理该 Intent。