Android 学习笔记

2016.2.29

今天遇到个大坑,多个AsyncTask执行execute()方法,会顺序执行,比如先执行了一个task,如果这个task没执行完,那么下一个task就不会执行。

改进方法是调用executeOnExecutor(...)

http://blog.csdn.net/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.csdn.net/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。

可参见syykt项目


解决了重大bug!
WebView 有时后退 总是后退不回去,最终原因终于找到

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
//                view.loadUrl(url);
//                return true;
                return super.shouldOverrideUrlLoading(view, url);
            }


不应是注释掉的那些内容,而是return super.shouldO....
终于解决这个问题了



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.csdn.net/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.csdn.net/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.csdn.net/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.csdn.net/AexLinda/article/details/50954176

可以看Lightning Browser代码,还有NumberPickerTest代码

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.csdn.net/nupt123456789/article/details/23790161



2016.9.27

非常好!直接拿来用!十大Material Design开源项目

http://www.csdn.net/article/2014-11-21/2822753-material-design-libs/1

Material Design相关

http://www.uisdc.com/comprehensive-material-design-note


2016.9.28

事件总线

com.squareup.otto.Bus

http://blog.csdn.net/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);
        }

方法名称可以任意,重点是参数,它是根据你的参数进行判断来自于哪个发送的事件。
可以参考Lightning Browser代码


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.csdn.net/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.csdn.net/lmj623565791/article/details/41531475/


2016.10.28

Service

http://blog.csdn.net/guolin_blog/article/details/11952435

http://blog.csdn.net/guolin_blog/article/details/9797169

http://blog.csdn.net/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'
        }
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值