《Android第一行代码》笔记

学习Android开发差点儿相同有两年时间了。期间也做了大大小小的一些项目。近来抽出闲暇想把Android基础强化一下,之前在网上看到了郭霖郭大神的几篇博客。从中受益不少。于是花了近一周时间看完了郭神的一本Android教材——《Android第一行代码》。这本书相比其它教材个人感觉更为基础,内容非常有用。看完之后我也有一些收获,学到了一些能够非常好的运用到实际中的Android小技巧。以下从中选出我认为非常有价值的地方做个记录。

同一时候欢迎各位指正补充~~

1、查看当前界面处于哪个Activity。

非常多时候当我们接手一个较为复杂的源代码的时候。里面会有非常多个Acvitity。此时我们往往非常难从中找出哪个界面相应哪个源代码,这无疑会降低我们的开发效率。

以下介绍书中一个小技巧:

1、 编写一个新Activity如BaseActivity去继承Activity,代码例如以下:

{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
}
}

2、让project里所有的Activity都继承自BaseActivity;

3、点击进入你想查看代码的界面,同一时候观察LogCat中的输出。打印出的信息就是相应的Activity的类名了。

个人心得:看到这里,或许你会认为,假设拿到一个源代码project,然后进去一个个的改还是会非常麻烦。我认为作者在这里主要是想介绍这样一种方法。我们在编程的时候能够考虑增加这样一种技巧。这样能够更好的与人合作一个项目。

2、当启动一个须要传递数据的Activity时,避免參数混淆。

大家对Intent的都非常熟悉,他是Android系统的搬运工。

当我们启动一个Acivity并希望向它传递一些数据,这时候通常都会用到intent。

一个项目中可能会有非常多个Activity都须要传递数据。而开发人员全然有可能不确定这些Activity分别要传递什么数据,这时候我们能够用一个技巧来规范这样一种“通信协议”。

public class AnotherActivity extends BaseActivity
{
public static void actionStart(Context context,String val1,String val2)
{
Intent intent = new Intent(context, AnotherActivity.class);
intent.putExtra("val1", val1);
intent.putExtra("val2", val2);
context.startActivity(intent);
}
}

这样一来,在使用的过程中。当须要跳转的时候能够用以下代码

AnotherActivity.actionStart(FirstActivity.this, "val1", "val2");

个人心得:个人认为这是一个非常不错的习惯,假设系统中带參数的跳转比較多就应该将跳转所有换成统一规范,这样能够降低合作开发中不必要的麻烦。

3、TableLayout的使用

TableLayout是在开发中非常少用到的一个布局。

当然对于这个控件有几个地方我认为也须要注意。

  • TableRow标签(TableLayout的一行)中的控件是不能指定宽度的。
  • 正因为TableRow不能设置宽度当须要布局自己主动拉伸宽度时。能够通过在TableLayout标签下设置

    android:stretchColunms="1"

    属性来指定某一列被拉伸解决(以上是指定拉伸第二列)。
  • 当某一行少一列数据的时候。最后会多出一列的空白。假设希望系统自己主动拉伸空间占满这一行,能够在当前行的某个控件标签下设置:
android:layout_span="2"

这样一来该控件就会占2个位置。

个人心得:在我所做过的项目中,尚未用过TableLayout,只是作为一个Android开发人员。应该对其有一定的了解,在恰当的时候能够非常好的使用之。

4、自己定义继承ArrayAdapter的适配器

我们在用listview的时候都会用到适配器,Android为我们做了两个经常使用的适配器:SimpleAdapter和ArrayAdapter等。当我们有特殊要求的时候须要自己定义一个适配器继承自BaseAdapter。这样能够更加灵活的完毕我们须要的特殊功能。但事实上大多时候我们能够编写一个继承自ArrayAdapter的适配器,这样更加简单:

public class MCAdapter extends ArrayAdapter<Fruit>
{ private int resourceId; public FruitAdapter(Context context, int textViewResourceId,
List<Fruit> objects) {
super(context, textViewResourceId, objects);
resourceId = textViewResourceId;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
... ...
return view;
}

这样一来。我们仅仅须要重写getView这样一个方法,而假设是继承自BaseAdapter,我们须要至少重写4个方法。能够是我们的代码更加简化。

个人心得:或许这个大家都知道吧。 反正我曾经都是自己定义适配器继承自BaseAdapter,然后重写4个方法,当中3个都是用不上的。。

5、Fragment回退栈

这里仅仅是想记录一个Fragment的方法:transaction.addToBackStack(null);

6、Broadcast Receiver

  • 广播接收器类中不同意开启线程
  • 发送有序广播:sendOrderedBroadcast
  • 在广播接收器中注冊有序广播优先级:
              <intent-filter **android:priority="50">
... ...
<intent/>
<receive/>
  • 阻止广播:abortBroadcast();
  • 本地广播:LocalBroadcastManager.sendBroadcast(intent);(无法用静态注冊方式)

个人心得:广播接收器是非经常常使用的。当中有序广播的优先级由应用自己来定这一点让我非常诧异。那岂不是又给了应用程序漏洞可钻?在曾经应用程序要拦截短信都是通过设置更高的广播优先级。然后阻断广播来实现,可是在Android4.4之后,增加了默认短信管理功能,这使得用户来决定谁来管理短信、电话本等等。看来谷歌也发现了这个潜在的问题。

7、调用系统相机

在使用系统相机的过程中。我们能够通过startActivityForResult启动相机,从而接收拍照成功与否的返回值。并且能够对拍照后的图片进行裁剪。

  • 启动相机拍照:
Intent intent = new intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_PHOTO);
  • 拍照完毕后裁剪:
Intent intent = new intent("android.media.action.CROP");
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, CROP_PHOTO);

个人心得:这里主要是对系统中的action的了解程度以及对action的參数的熟悉。详见Android action大全

8、Android位置服务

书中的这一章主要分为两个部分:1、通过Android系统API获取本机位置信息;2、通过调用百度地图显示地图信息。前者是Android自带的函数,而后者须要下载百度API。

对于第一部分Android API没有不论什么变化。而第二部分书中是用的百度地图2.3版。而在我写这篇文章的时候百度地图最新版是3.2。非常多函数已经不再适用,所以这一章的内容基本能够忽略了。

大家能够依照需求照着百度文档来学习这一部分内容:

title=androidsdk">百度地图文档

个人心得:尽管书上的程序已经不能使用。可是作为了解,个人认为照着百度文档实现书中的内容也是非常有必要的,并且用起来也非常easy。至于很多其它复杂的高级功能大家到用到的时候在学不迟。也会学的更快一些。

好了,以上是我在读这本书中所收获的一些东西,作者提供的一些小技巧假设能够运用得当,能够非常好的帮助我们开发项目。提高我们的效率。今后我也会不断增加所学的有用技巧。也欢迎大家对内容进行指正、补充。

谢谢!

——超低空

上一篇:【技术干货】听阿里云CDN安防技术专家金九讲tengine+lua开发


下一篇:SVN报E155024: Invalid relocation destination