《第一行代码》第二版是基于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