Android 《第一行代码》第二版 笔记

《第一行代码》第二版是基于Android 7.0 的
guolin大神:《第二行代码》
网上找到电子书资源,扫描版pdf,在百度分享:
链接: https://pan.baidu.com/s/1i5Gfp5b 密码: vagx
书中的示例代码
《第二行代码》全书源代码

面向初学者的书,所以差不多两天从头到尾扫了一遍,记录一下自己之前掌握有偏差和可以学习的地方。

0.细节Log和 System.out 差异 以及Action 和 catergory,需要总结

1.活动管理器
书中写的模式 是单独拿出来一个类来实现,每次打开一个Activity然后加进去,最后退出的时候 遍历关闭。

之前项目参考leader的框架,其实可以更加省事,在application 对象中定义方法 :

private static ArrayList list = new ArrayList();
/**
 * Activity关闭时,删除Activity列表中的Activity对象
 */
public void removeActivity(Activity a) {
    if (list.contains(a)) {
        list.remove(a);
        a = null;
    }

}

/**
 * 向Activity列表中添加Activity对象
 */
public void addActivity(Activity a) {
    if (!list.contains(a)) {
        list.add(a);
    }
}

/**
 * 关闭Activity列表中的所有Activity
 */
public void finishActivity() {
    for (Activity activity : list) {
        if (null != activity) {
            LogUtil.e("-----activity = " + activity.getClass().getName());
            activity.finish();
            activity = null;
        }
    }
    // 杀死该应用进程
    System.exit(0);
    // android.os.Process.killProcess(android.os.Process.myPid());
}

在定义的Baseactivity中的生命周期做相应处理,获取application 的单例对象进行操作。就没必要每打开一个Activity 添加一次。

public abstract class BaseActivity extends FragmentActivity {
    ........
  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //获取 当前application对象把Activity添加进去
    AppContext.getContext().addActivity(this);
 }
 ..........

@Override
protected void onDestroy() {

  //获取 当前application对象把Activity移除
    AppContext.getContext().removeActivity(this);
    super.onDestroy();
 }
}

在其他地方调用,比如点击back两次 退出应用

  if (!isBack) {
            Toast.makeText(this, "2秒之内,再按一次退出", Toast.LENGTH_SHORT).show();
            downTime = event.getDownTime();
            isBack = true;
            return true;
        } else {
            if (event.getDownTime() - downTime <= 2000) {
                isUpdataFinish(true);
                //获取 当前application对象把Activity遍历移除
               AppContext.getContext().finishActivity();
            } else {
                Toast.makeText(this, "2秒之内,再按一次退出", Toast.LENGTH_SHORT)
                        .show();
                downTime = event.getDownTime();
                return true;
            }
        }

2.定义启动Activity 参数。

这样子分模块开发相互交互直接就知道了所需参数,

SecondActivity.class中定义方法

public static void actionStart(Context context,String data1,String data2){
    Intent intent = new Intent(context,SecondActivity.class);
    intent.putExtra("param1","data1");
    intent.putExtra("param2","data2");
    context.startActivity(intent);
}

FirstActivity中启动时

SecondActivity.actionStart(FirstActivity.this,"data1","data2");

3.Button
这个之前真的没有留意过,系统自动会把Button的文本转为大写。
修改 android:textAllCaps="false"即可

 

4.Percent Support Library
算是首次接触这个新的支持布局

函数库,发现其中主要包含2个类。
PercentFrameLayout、PercentRelativeLayout、PercentLayoutHelper
大部分的百分比实现逻辑都在PercentLayoutHelper这个类中,首先我们需要知道,PercentFrameLayout、PercentRelativeLayout分贝继承于FrameLayout、RelativeLayout。原有的属性和方法都是可以使用的。同时PercentHelper还对其做了百分比布局的扩展,在xml文件中,增加了如下属性配置。

heightPercent :百分比表示高度
widthPercent :百分比表示宽度
marginBottomPercent :百分比表示底部的间隔
marginEndPercent:百分比表示距离最后一个View之间的间隔
marginLeftPercent:百分比表示左边的间隔
marginPercent :百分比表示View之间的间隔
marginRightPercent:百分比表示右边的间隔
marginStartPercent:百分比表示距离第一个View之间的间隔
marginTopPercent:百分比表示顶部的间隔

随后认真学习。

5..9图片的问题

之前涉及的很少,知道有这个东西。在这里大概知道.9主要用于确定图片拉伸区域和内容区域,而mdpi、hdpi、xhdpi、xxhdpi和xxxhdpi是用于适配屏幕像素密度区间,保证图片可以在不同像素密度的手机上都显示清晰而不会过多缩放。
要学习如何制作.9切图和应用场景。

6.限定符、最小宽度限定符
之前没做过平板开发适配,现在在做,也要认真学一下。

7.广播强制下线
相比第一版有更巧妙的处理,在baseActivity中 定义好内部类广播,

public class BaseActivity extends Activity {  
 private ForceOfflineReceiver mForceOfflineReceiver ;
@Override  
protected void onResume( ) {  
    super.onResume( );  
   //注册 mForceOfflineReceiver
}  
  
@Override  
protected void onPause() {  
    super.onPause();  
      //反注册 mForceOfflineReceiver
}  
  

 class ForceOfflineReceiver extends BroadcastReceiver {  

@Override  
public void onReceive(final Context context, Intent intent) {  
    //do sth you want
  }    
}  
}  

这样做的过程 只有在resume 的前端显示的acivity 能激活这个广播,避免了原来在oncreat()注册 收到一堆消息。

8.通知更改呼吸灯 、增加预览大图
这个可以加进去增加交互友好,之前没有尝试过。

2017年10月28日 15:28:51

所需权限

 

sample code:

  //为了版本兼容  选择V7包下的NotificationCompat进行构造
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    //Ticker是状态栏显示的提示
    builder.setTicker("简单Notification");
    //第一行内容  通常作为通知栏标题
    builder.setContentTitle("标题");
    //第二行内容 通常是通知正文
    builder.setContentText("通知内容");
    //第三行内容 通常是内容摘要什么的 在低版本机器上不一定显示
    builder.setSubText("这里显示的是通知第三行内容!");
    //ContentInfo 在通知的右侧 时间的下面 用来展示一些其他信息
    //builder.setContentInfo("2");
    //number设计用来显示同种通知的数量和ContentInfo的位置一样,如果设置了ContentInfo则number会被隐藏
    builder.setNumber(2);
    //可以点击通知栏的删除按钮删除
    builder.setAutoCancel(true);
    //系统状态栏显示的小图标
    builder.setSmallIcon(R.mipmap.ic_launcher);
    //下拉显示的大图标
    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.push));
    Intent intent = new Intent(this,SettingsActivity.class);
    PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0);
    //点击跳转的intent
    builder.setContentIntent(pIntent);
    //通知默认的声音 震动 呼吸灯 
    builder.setDefaults(NotificationCompat.DEFAULT_ALL);
    Notification notification = builder.build();
    manger.notify(TYPE_Normal,notification);

显示 下拉的大图

   android.support.v4.app.NotificationCompat.BigPictureStyle style = new android.support.v4.app.NotificationCompat.BigPictureStyle();
    style.setBigContentTitle("BigContentTitle");
    style.setSummaryText("SummaryText");
    style.bigPicture(BitmapFactory.decodeResource(mContext.getResources(), R.mipmap.app_icon_big));
    builder.setStyle(style);

9.多窗口模式,需要学习(可惜没有 Android 7.0的机子 )。

问题部分带整理实践解决 2017年10月21日 11:24:14

你可能感兴趣的:(Android 《第一行代码》第二版 笔记)