《第一行代碼》第二版是基于Android 7.0 的
guolin大神:《第二行代碼》
網(wǎng)上找到電子書資源,掃描版pdf,在百度分享:
鏈接: https://pan.baidu.com/s/1i5Gfp5b 密碼: vagx
書中的示例代碼
《第二行代碼》全書源代碼
面向初學(xué)者的書隙券,所以差不多兩天從頭到尾掃了一遍际看,記錄一下自己之前掌握有偏差和可以學(xué)習(xí)的地方岳枷。
0.細(xì)節(jié)Log和 System.out 差異 以及Action 和 catergory趣惠,需要總結(jié)
1.活動(dòng)管理器
書中寫的模式 是單獨(dú)拿出來(lái)一個(gè)類來(lái)實(shí)現(xiàn)染乌,每次打開一個(gè)Activity然后加進(jìn)去俺榆,最后退出的時(shí)候 遍歷關(guān)閉。
之前項(xiàng)目參考leader的框架粒蜈,其實(shí)可以更加省事顺献,在application 對(duì)象中定義方法 :
private static ArrayList<Activity> list = new ArrayList<Activity>();
/**
* Activity關(guān)閉時(shí),刪除Activity列表中的Activity對(duì)象
*/
public void removeActivity(Activity a) {
if (list.contains(a)) {
list.remove(a);
a = null;
}
}
/**
* 向Activity列表中添加Activity對(duì)象
*/
public void addActivity(Activity a) {
if (!list.contains(a)) {
list.add(a);
}
}
/**
* 關(guān)閉Activity列表中的所有Activity
*/
public void finishActivity() {
for (Activity activity : list) {
if (null != activity) {
LogUtil.e("-----activity = " + activity.getClass().getName());
activity.finish();
activity = null;
}
}
// 殺死該應(yīng)用進(jìn)程
System.exit(0);
// android.os.Process.killProcess(android.os.Process.myPid());
}
在定義的Baseactivity中的生命周期做相應(yīng)處理薪伏,獲取application 的單例對(duì)象進(jìn)行操作。就沒(méi)必要每打開一個(gè)Activity 添加一次粗仓。
public abstract class BaseActivity extends FragmentActivity {
........
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//獲取 當(dāng)前application對(duì)象把Activity添加進(jìn)去
AppContext.getContext().addActivity(this);
}
..........
@Override
protected void onDestroy() {
//獲取 當(dāng)前application對(duì)象把Activity移除
AppContext.getContext().removeActivity(this);
super.onDestroy();
}
}
在其他地方調(diào)用嫁怀,比如點(diǎn)擊back兩次 退出應(yīng)用
if (!isBack) {
Toast.makeText(this, "2秒之內(nèi),再按一次退出", Toast.LENGTH_SHORT).show();
downTime = event.getDownTime();
isBack = true;
return true;
} else {
if (event.getDownTime() - downTime <= 2000) {
isUpdataFinish(true);
//獲取 當(dāng)前application對(duì)象把Activity遍歷移除
AppContext.getContext().finishActivity();
} else {
Toast.makeText(this, "2秒之內(nèi)借浊,再按一次退出", Toast.LENGTH_SHORT)
.show();
downTime = event.getDownTime();
return true;
}
}
2.定義啟動(dòng)Activity 參數(shù)塘淑。
這樣子分模塊開發(fā)相互交互直接就知道了所需參數(shù),
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中啟動(dòng)時(shí)
SecondActivity.actionStart(FirstActivity.this,"data1","data2");
3.Button
這個(gè)之前真的沒(méi)有留意過(guò)蚂斤,系統(tǒng)自動(dòng)會(huì)把Button的文本轉(zhuǎn)為大寫存捺。
修改 android:textAllCaps="false"即可
<Button
android:textAllCaps="false"
android:id="@+id/btn_check_in"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="test" />
4.Percent Support Library
算是首次接觸這個(gè)新的支持布局
函數(shù)庫(kù),發(fā)現(xiàn)其中主要包含2個(gè)類。
PercentFrameLayout捌治、PercentRelativeLayout岗钩、PercentLayoutHelper
大部分的百分比實(shí)現(xiàn)邏輯都在PercentLayoutHelper這個(gè)類中,首先我們需要知道肖油,PercentFrameLayout兼吓、PercentRelativeLayout分貝繼承于FrameLayout、RelativeLayout森枪。原有的屬性和方法都是可以使用的视搏。同時(shí)PercentHelper還對(duì)其做了百分比布局的擴(kuò)展,在xml文件中县袱,增加了如下屬性配置浑娜。
heightPercent :百分比表示高度
widthPercent :百分比表示寬度
marginBottomPercent :百分比表示底部的間隔
marginEndPercent:百分比表示距離最后一個(gè)View之間的間隔
marginLeftPercent:百分比表示左邊的間隔
marginPercent :百分比表示View之間的間隔
marginRightPercent:百分比表示右邊的間隔
marginStartPercent:百分比表示距離第一個(gè)View之間的間隔
marginTopPercent:百分比表示頂部的間隔
隨后認(rèn)真學(xué)習(xí)。
5..9圖片的問(wèn)題
之前涉及的很少式散,知道有這個(gè)東西筋遭。在這里大概知道.9主要用于確定圖片拉伸區(qū)域和內(nèi)容區(qū)域,而mdpi杂数、hdpi宛畦、xhdpi、xxhdpi和xxxhdpi是用于適配屏幕像素密度區(qū)間揍移,保證圖片可以在不同像素密度的手機(jī)上都顯示清晰而不會(huì)過(guò)多縮放次和。
要學(xué)習(xí)如何制作.9切圖和應(yīng)用場(chǎng)景。
6.限定符那伐、最小寬度限定符
之前沒(méi)做過(guò)平板開發(fā)適配踏施,現(xiàn)在在做,也要認(rèn)真學(xué)一下罕邀。
7.廣播強(qiáng)制下線
相比第一版有更巧妙的處理畅形,在baseActivity中 定義好內(nèi)部類廣播,
public class BaseActivity extends Activity {
private ForceOfflineReceiver mForceOfflineReceiver ;
@Override
protected void onResume( ) {
super.onResume( );
//注冊(cè) mForceOfflineReceiver
}
@Override
protected void onPause() {
super.onPause();
//反注冊(cè) mForceOfflineReceiver
}
class ForceOfflineReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
//do sth you want
}
}
}
這樣做的過(guò)程 只有在resume 的前端顯示的acivity 能激活這個(gè)廣播诉探,避免了原來(lái)在oncreat()注冊(cè) 收到一堆消息日熬。
8.通知更改呼吸燈 、增加預(yù)覽大圖
這個(gè)可以加進(jìn)去增加交互友好,之前沒(méi)有嘗試過(guò)肾胯。
2017年10月28日 15:28:51
所需權(quán)限
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FLASHLIGHT"/>
sample code:
//為了版本兼容 選擇V7包下的NotificationCompat進(jìn)行構(gòu)造
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
//Ticker是狀態(tài)欄顯示的提示
builder.setTicker("簡(jiǎn)單Notification");
//第一行內(nèi)容 通常作為通知欄標(biāo)題
builder.setContentTitle("標(biāo)題");
//第二行內(nèi)容 通常是通知正文
builder.setContentText("通知內(nèi)容");
//第三行內(nèi)容 通常是內(nèi)容摘要什么的 在低版本機(jī)器上不一定顯示
builder.setSubText("這里顯示的是通知第三行內(nèi)容竖席!");
//ContentInfo 在通知的右側(cè) 時(shí)間的下面 用來(lái)展示一些其他信息
//builder.setContentInfo("2");
//number設(shè)計(jì)用來(lái)顯示同種通知的數(shù)量和ContentInfo的位置一樣,如果設(shè)置了ContentInfo則number會(huì)被隱藏
builder.setNumber(2);
//可以點(diǎn)擊通知欄的刪除按鈕刪除
builder.setAutoCancel(true);
//系統(tǒng)狀態(tài)欄顯示的小圖標(biāo)
builder.setSmallIcon(R.mipmap.ic_launcher);
//下拉顯示的大圖標(biāo)
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.push));
Intent intent = new Intent(this,SettingsActivity.class);
PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0);
//點(diǎn)擊跳轉(zhuǎn)的intent
builder.setContentIntent(pIntent);
//通知默認(rèn)的聲音 震動(dòng) 呼吸燈
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.多窗口模式敬肚,需要學(xué)習(xí)(可惜沒(méi)有 Android 7.0的機(jī)子 )毕荐。
問(wèn)題部分帶整理實(shí)踐解決 2017年10月21日 11:24:14