Via

不为无益之事,何以遣有涯之生?


  • 首页

  • 归档

  • 标签

Android Studio插件整理

发表于 2017-04-07

The Complete Android Activity/Fragment Lifecycle

发表于 2017-04-07

Lifecycle

android:windowSoftInputMode属性详解

发表于 2017-04-07

Activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,这是Android 1.5后的一个新特性。
这个属性能影响两件事情:
1.当有焦点产生时,软键盘是隐藏还是显示
2.是否减少活动主窗口大小以便腾出空间显示软键盘
它的设置必须是下面列表中的一个值,一个”state…”值加一个”adjust…”值的组合。在任一组设置多个值,各个值之间用|分开。

在这设置的值(除”stateUnspecified”和”adjustUnspecified”以外)将覆盖在主题中设置的值

各值的含义:
stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
stateHidden:用户选择activity时,软键盘总是被隐藏
stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
stateVisible:软键盘通常是可见的
stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

出发是为了更好的归来

发表于 2017-04-07

很多人第一次离家,应该是刚上大学那会吧!
背上行囊,告别送别的父母,背过身去,强忍着眼泪,伴着鸣笛声,驶向未知的地方。
就这样,火车站,也开始变成了一个离别与相聚的地方。

火车的车轮撞击着铁轨哐当哐当,
你是满心期待着回到家乡?还是踏足一座陌上的城市呢?

火车站,形形色色,匆匆忙忙的人们,有人是归途,有人是启程。

中国的火车站,大都一个模样,
但相同的都是拎着打包小包的人们,他们面显疲惫,但内心却憧憬着前方。

他们因不同的原因来到此地,
因为出发,因为到达。

未完待续…

Android开发之混淆使用手册

发表于 2017-04-07

Fragment onActivityResult回调不被调用的解决方案

发表于 2017-04-07

Fragment中的onActivityResult不被调用,一般有几种原因,需要一一排查。

1.检查该Fragment所属的Activity是否重写了onActivityResult,若重写了,请确保写了super.onActivityResult();

1
2
3
4
5
6
7
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
//Activity中相关处理代码
}
}

2.检查Fragment中的startActivityForResult的调用方式。
请确保不要使用getActivity().startActivityForResult方法,而是要直接使用startActivityForResult(…)

3.如果以上两方面都没能解决问题,很可能是如下情况了,略复杂:
该情况是在support-library中使用了Nested Fragment,就是说在Fragment中进行了嵌套,比如用ViewPager展示Fragment等情况。这可以算Google的一个Bug,具体可参见这篇博客:
http://blog.shamanland.com/2014/01/nested-fragments-for-result.html
解决方案:
最好的方式是写一个BaseActivity继承FragmentActivity,重写onActivityResult方法,你用到的Activity都继承BaseActivity来做。BaseActivity具体实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import java.util.List;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.util.Log;
public abstract class BaseActivity extends FragmentActivity {
private static final String TAG = "BaseActivity";
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
FragmentManager fm = getSupportFragmentManager();
int index = requestCode >> 16;
if (index != 0) {
index--;
if (fm.getFragments() == null || index < 0
|| index >= fm.getFragments().size()) {
Log.w(TAG, "Activity result fragment index out of range: 0x"
+ Integer.toHexString(requestCode));
return;
}
Fragment frag = fm.getFragments().get(index);
if (frag == null) {
Log.w(TAG, "Activity result no fragment exists for index: 0x"
+ Integer.toHexString(requestCode));
} else {
handleResult(frag, requestCode, resultCode, data);
}
return;
}
}
/**
* 递归调用,对所有子Fragement生效
*
* @param frag
* @param requestCode
* @param resultCode
* @param data
*/
private void handleResult(Fragment frag, int requestCode, int resultCode,
Intent data) {
frag.onActivityResult(requestCode & 0xffff, resultCode, data);
List<Fragment> frags = frag.getChildFragmentManager().getFragments();
if (frags != null) {
for (Fragment f : frags) {
if (f != null)
handleResult(f, requestCode, resultCode, data);
}
}
}
}

你真的会写单例?

发表于 2017-04-07

Android View的绘制流程

发表于 2017-04-07

Android Activity的四种启动模式

发表于 2017-04-07

最近刚好手头上没有任务,于是就来总结一下Android的知识点,温故而知新,可以为师矣嘛!虽然都比较基础,但有句老话说——好记性不如烂笔头,往往是基础的知识,得不到重视,更容易忘记!

设置Activity的启动模式

有两种方法来设置Activity的启动模式:
1.在AndroidManifest.xml的activity元素中设置launchMode属性,该方式为最常用方式:

1
2
3
<activity
...
android:launchMode="standard"/>

2.使用Java代码设置:

1
2
3
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

以上两种设置启动模式的方法还是有区别的,按照Android开发的惯例,Java代码的优先级肯定是高于xml代码的,如果两者同时存在的话,Java代码生效。另外在AndroidManifest.xml中无法设置FLAG_ACTIVITY_CLEAR_TOP标识,在Java代码中无法指定singleInstance模式。

四种启动模式
standard:标准模式

系统默认的模式,如果你没有设置启动模式的话默认这个模式。标准模式下的特点是每启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。被创建的Activity实例的生命周期正常调用,也就是onCreate、onStart、onResume都会被调用。
在这种模式下,当我们多次启动同一个Activity的时候,系统就会创建多个实例并把他们一一放到任务栈中。任务栈是一种后进先出的结构,每当我们按一下返回键的时候,就会有一个Activity出栈。

singleTop:栈顶复用模式

这种模式下,待启动的Activity如果位于任务栈的栈顶,那么就不会新建这个Activity的实例了。同时它的onNewIntent方法会被调用,我们可以在此方法取出当前请求信息。要注意的是,这个Activity的onCreate和onStart方法并不会被系统调用,因为它并没有发生改变。另外一种情况是,当这个Activity并不在任务栈的栈顶,这样的话新的Activity就会被以新实例的方式创建,onCreate、onStart、onResume都会被调用。

singleTask:栈内复用模式

这种模式下,相当于单例模式。单例模式相信大家都懂,单例模式就是要确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。Activity被创建出来,肯定需要一个任务栈,singleTask模式下启动此Activity首先需要判断有没有此Activity想要的任务栈,如果不存在就创建一个任务栈,并将此Activity压到栈中。如果任务栈已经存在,并且任务栈中也存在此Activity的实例,系统就会将此Activity调到栈顶,显示出来。也就是说,待启动的Activity在任务栈中如果已经存在,无论你启动多少次这个Activity都不会创建新的实例了,此时也会只调用onNewIntent方法。

singleInstance:单实例模式

这个模式可以理解为singleTask模式的加强版。此模式除了拥有singleTask模式所以的特性外,还有一点就是此模式的Activity只能单独的存在于一个任务栈中,由于栈内复用的特性,所以后续的请求均不会创建新的Activity实例了,除非这个任务栈被系统销毁了。

Android Service的生命周期

发表于 2017-04-07
12345
shangxiazuoyou

shangxiazuoyou

Android

44 日志
© 2017 shangxiazuoyou
由 Hexo 强力驱动
主题 - NexT.Mist