学习Android小知识点 --- 记录&总结

目录:
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 属性,它是设置你应用安装位置的。
有三个值,分别是:

  1. auto 跟随手机设置自动匹配位置
  2. internalOnly 默认值 如果内存为空,则程序将不能安装(我们做开发时候经常能遇见安装失败,这个就是众多失败原因之一)
  3. 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。

7

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容