2016.2.29
今天遇到个大坑,多个AsyncTask执行execute()方法,会顺序执行,比如先执行了一个task,如果这个task没执行完,那么下一个task就不会执行。
改进方法是调用executeOnExecutor(...)
http://blog.youkuaiyun.com/lichao3459/article/details/17712393
2016.4.8
EditText 可以使用 setError 设置显示错误信息(比如 不能为空!)
2016.4.14
release版xUtils的绑定点击不能响应,不能访问网络,原因是混淆配置没有配置上,Android Studio是在proguard-rules.pro里配置
p.s. xUtils的混淆配置:
-dontwarn com.lidroid.xutils.**
-keep class com.lidroid.xutils.** { *; }
-keep class * extends java.lang.annotation.Annotation { *; }
2016.5.11
关于监听短信:
http://blog.youkuaiyun.com/mad1989/article/details/22426415
测试好用,可以读取短信数据库,太流氓。
关于fragment做成tab那种切换,首次点击tab add,再次点击则直接show
相关代码参见xyykt项目MainTabActivity
2016.5.12
PagerAdapter 的 instantiateItem 方法是在预加载时候调用,不是当前现在就调用。
广泛使用的异步加载图片的库:Android-Universal-Image-Loader
https://github.com/nostra13/Android-Universal-Image-Loader
注意要先调用ImageLoader.getInstance().init(...)方法初始化。
这个非常厉害,无论是应用在ListView还是ViewPaper。
PagerAdapter配合ImageLoader可以实现滚动Banner。
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// view.loadUrl(url);
// return true;
return super.shouldOverrideUrlLoading(view, url);
}
2016.6.13
使用
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
退出出现问题,程序的activity自动重启。查网络结果是系统会重新启动Task栈顶的Activity。
http://www.jianshu.com/p/636edca24443
解决方法是用单例维护所有的activity,BaseActivity的onCreate里调用add,将activity加入List,onDestroy调用remove。然后在退出方法里将List里的所有Activity调用finish,然后退出。参见syuykt项目。
http://www.codeceo.com/article/6-ways-quit-android-app.html
http://blog.youkuaiyun.com/wellsoho/article/details/49509153
2016.6.17
学无止境哎
google官方出的下拉加载 SwipeRefreshLayout
http://www.open-open.com/lib/view/open1430797271054.html
xml里可以使用style
<TextView
android:id="@+id/tv_link_us"
style="@style/my_style_0"
android:drawableRight="@drawable/arrow_next_selector"
android:text="@string/my_linkUs" />
其中 my_style_0在style中定义
<style name="my_style_0">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">45dp</item>
<item name="android:paddingLeft">15dp</item>
<item name="android:gravity">center_vertical</item>
<item name="android:textColor">@color/brown</item>
<item name="android:background">@drawable/my_press_selector</item>
<item name="android:textSize">@dimen/word_size_16</item>
</style>
2016.6.29
BroadcastReceiver
通过AlarmManager创建定时器,到时会对BroadcastReceiver发送广播。关机是无响应的。
http://www.cnblogs.com/linjiqin/archive/2011/02/26/1966065.html
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
manager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, sender);
具体见syuept工程
存在问题:BroadcastReceiver里调用主程序里的代码无响应,似乎是不在一个进程里,需要与Activity通信。
http://blog.youkuaiyun.com/android_jiangjun/article/details/39928243
public void registerRebootReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_INTENT_RECEIVER);
registerReceiver(alarmReceiver, filter);
}
BroadcastReceiver alarmReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
LogUtils.d("BroadcastReceiver-----------------------");
if (intent.getAction().equals(ACTION_INTENT_RECEIVER)) {
LogUtils.d("reboot-----------------------");
_rebootHandler.sendEmptyMessage(0x01);
}
}
};
AlarmReceiver中:
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "alarm", Toast.LENGTH_LONG).show();
processCustomMessage(context);
}
private void processCustomMessage(Context context) {
Intent mIntent=new Intent(ACTION_INTENT_RECEIVER);
mIntent.putExtra("message", "测试Broadcast与Activity之间的通信");
context.sendBroadcast(mIntent);
}
打开系统设置页面:
startActivity(new Intent(Settings.ACTION_SETTINGS));
http://blog.youkuaiyun.com/wlzf6296149/article/details/8712876
2016.9.7
类似微信右上角点+号的下拉菜单,是叫toolbar
http://www.07net01.com/2015/12/1045768.html
2016.9.21
关于Android Support Annotation的@NonNull @StringRes @IntDef
http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0427/2797.html
2016.9.22
关于依赖注入
http://kb.cnblogs.com/page/45266/
关于dagger,注入
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0519/2892.html
帮助理解
http://blog.youkuaiyun.com/AexLinda/article/details/50954176
2016.9.23
androidannotations框架
注解1:@ViewById 与findViewById功能相似,如果ViewById后没有设置资源ID的话,就是自动查找与变量名称相同的id资源。
注解2:@Click 点击事件处理的注解。
注解3:@UiThread 后台Ui线程的注解,省去了Handler等等。
注解4:@EActivity 提示Activity的注解,注意,该注解将Activity编译成Activity_,注意,多一个下划线“_”,因此在AndroidManifest.xml文件中需要将其添加下滑线
注解5:@AfterViews 是指View类注入完毕之后执行的代码。
http://blog.youkuaiyun.com/nupt123456789/article/details/23790161
2016.9.27
非常好!直接拿来用!十大Material Design开源项目
http://www.youkuaiyun.com/article/2014-11-21/2822753-material-design-libs/1
http://www.uisdc.com/comprehensive-material-design-note
2016.9.28
事件总线
com.squareup.otto.Bus
http://blog.youkuaiyun.com/kemeng7758/article/details/50837330
https://segmentfault.com/a/1190000005019322
自定义继承自Object的Event,通过mEventBus.post(new BrowserEvents.BookmarkAdded(title, url));类似这种发送事件。
接收事件的类需要注册和注销监听,通过
mEventBus.register(mBusEventListener);
mEventBus.unregister(mBusEventListener);
监听类可以继承自Object,事件接收方法需有@Subscribe注解,如:
@Subscribe
public void loadUrlInCurrentTab(final BrowserEvents.OpenUrlInCurrentTab event) {
mPresenter.loadUrlInCurrentView(event.url);
// keep any jank from happening when the drawer is closed after the
// URL starts to load
mDrawerHandler.postDelayed(new Runnable() {
@Override
public void run() {
mDrawerLayout.closeDrawer(mDrawerRight);
}
}, 150);
}
方法名称可以任意,重点是参数,它是根据你的参数进行判断来自于哪个发送的事件。
2016.9.30
PreferenceFragment,专门为设置而生的Fragment,参考Lightning Browser代码
多渠道打包:
productFlavors
http://stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/
CoordinatorLayout
CoordinatorLayout作为“super-powered FrameLayout”基本实现两个功能:
1、作为顶层布局
2、调度协调子布局
比如向下拖拽显示顶部内容,向上滑动隐藏顶部。待看
http://blog.youkuaiyun.com/xyz_lmn/article/details/48055919
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0717/3196.html
DrawerLayout
DrawerLayout是侧滑菜单控件,可以从左滑出或从右滑出(Lighting Browser那样)
<android.support.v4.widget.DrawerLayout
android:id="@+id/id_drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_light">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/darker_gray" >
</RelativeLayout>
<RelativeLayout
android:id="@+id/id_left_menu"
android:layout_width="200dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@android:color/holo_green_light">
</RelativeLayout>
<RelativeLayout
android:id="@+id/id_right_menu"
android:layout_width="100dp"
android:layout_height="match_parent"
android:layout_gravity="end"
android:background="@android:color/holo_orange_light">
</RelativeLayout>
</android.support.v4.widget.DrawerLayout>
从左滑出的layout的layout_gravity为start,从右为end
详见NumberPickerTest代码
使用DrawerLayout实现手机qq类似效果
http://blog.youkuaiyun.com/lmj623565791/article/details/41531475/
2016.10.28
Servicehttp://blog.youkuaiyun.com/guolin_blog/article/details/11952435
http://blog.youkuaiyun.com/guolin_blog/article/details/9797169
http://blog.youkuaiyun.com/mad1989/article/details/22492519
service生命周期
2016.11.17
新建的工程编译通过,但是运行时崩溃,提示
android.content.res.Resources$NotFoundException: File res/drawable/abc_vector_test.xml
解决办法为 build.gradle 中
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.1'
}
}
gradle版本改为2.2.1
然后在app的build.gradle中,增加
vectorDrawables.useSupportLibrary = true
最终效果为;
android {
compileSdkVersion 24
buildToolsVersion "24.0.1"
defaultConfig {
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
vectorDrawables.useSupportLibrary = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}