20169221 2016-2017-2 《移动平台开发》第七周学习总结

20169214 2016-2017-2 《******》第*周学习总结

教材学习内容总结

第二十六章 UI组件

1.使用UI工具:只须要把ui组件拖拽到布局上便可
2.使用基本组件
BasicComponents项目清单文件java

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.basiccomponents"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.basiccomponents.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category
android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>

Application元素定义了主活动
3.布局文件包含LinerLayout元素,带有三个字元素,两个组件和一个按钮
4.Toast:显示一条信息做为给客户的反馈(不代替当前活动,只占用一条消息的空间)
两种重载形式都只接受一个字符
5.AlterDialog也是用户反馈窗口,一个按钮能够连接到监听器,单机该按钮,出发监听器。
6.通知:出如今状态栏的一条消息和Toast不一样,它是持久的,并将保持显示。
7.PendingIntent:当用户戳鞥通知会调用PendingIntent类的send方法。android

pendingIntent类
要获得一个pendingIntent对象,使用方法类的静态方法 getActivity(Context, int, Intent, int),getBroadcast(Context, int, Intent, int),getService(Context, int, Intent, int) 分别对应着Intent的3个行为,跳转到一个activity组件、打开一个广播组件和打开一个服务组件。
参数有4个,比较重要的事第三个和第一个,其次是第四个和第二个。能够看到,要获得这个对象,必须传入一个Intent做为参数,必须有context做为参数。
pendingIntent是一种特殊的Intent。主要的区别在于Intent的执行马上的,而pendingIntent的执行不是马上的。pendingIntent执行的操做实质上是参数传进来的Intent的操做,可是使用pendingIntent的目的在于它所包含的Intent的操做的执行是须要知足某些条件的。
主要的使用的地方和例子:通知Notificatio的发送,短消息SmsManager的发送和警报器AlarmManager的执行等等。
Android的状态栏通知(Notification)
若是须要查看消息,能够拖动状态栏到屏幕下方便可查看消息。
步骤:
1获取通知管理器NotificationManager,它也是一个系统服务
2创建通知Notification notification = new Notification(icon, null, when);
3为新通知设置参数(好比声音,震动,灯光闪烁)
4把新通知添加到通知管理器
发送消息的代码以下:git

//获取通知管理器
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)
int icon = android.R.drawable.stat_notify_chat;
long when = System.currentTimeMillis();//通知发生的时间为系统当前时间
//新建一个通知,指定其图标和标题
Notification notification = new Notification(icon, null, when);//第一个参数为图标,第二个参数为短暂提示标题,第三个为通知时间
notification.defaults = Notification.DEFAULT_SOUND;//发出默认声音
notification.flags |= Notification.FLAG_AUTO_CANCEL;//点击通知后自动清除通知
Intent openintent = new Intent(this, OtherActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, openintent, 0);//当点击消息时就会向系统发送openintent意图
notification.setLatestEventInfo(this, “标题”, “我是内容", contentIntent);
mNotificationManager.notify(0, notification);//第一个参数为自定义的通知惟一标识

重点是setLatestEventInfo( )方法的最后一个参数!!!!它是一个PendingIntent!!!!!!!!!
这里使用到了PendingIntent(pend本意是待定,不肯定的意思)
PendingIntent能够看做是对Intent的包装。PendingIntent主要持有的信息是它所包装的Intent和当前Application的Context。正因为PendingIntent中保存有当前Application的Context,使它赋予带他程序一种执行的Intent的能力,就算在执行时当前Application已经不存在了,也能经过存在PendingIntent里的Context照样执行Intent。
PendingIntent的一个很好的例子:
SmsManager的用于发送短信的方法:
sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent);
第一个参数:destinationAddress对方手机号码
第二个参数:scAddress短信中心号码通常设置为空
第三个参数:text短信内容
第四个参数:sentIntent判断短信是否发送成功,若是你没有SIM卡,或者网络中断,则能够经过这个itent来判断。注意强调的是“发送”的动做是否成功。那么至于对于对方是否收到,另当别论
第五个参数:deliveryIntent当短信发送到收件人时,会收到这个deliveryIntent。即强调了“发送”后的结果
就是说是在"短信发送成功"和"对方收到此短信"才会激活 sentIntent和deliveryIntent这两个Intent。这也至关因而延迟执行了Intent
上面两个例子能够理解,PendingIntent就是一个能够在知足必定条件下执行的Intent,它相比于Intent的优点在于本身携带有Context对象,这样他就没必要依赖于某个activity才能够存在。网络

第二十七章 布局

1.安卓中的一些布局:app

  • LinearLayout:全部子视图一个方向,对齐的一个布局
  • RelativeLayout:根据子视图的一个或多个同级的位置来排列的一个布局
  • FrameLayout:将每个子视图放在另外一个子视图顶部的一个布局
  • TableLayout:将子视图按照行列组织的布局
  • GridLayout:将子视图放置到一个栅格的一种布局ide

    第二十八章 监听器

    1.要让程序响应某一件事,须要为该事件写一个监听器
    |view中监听器接口
    | 接口 | 方法 |
    |OnClickListener | onClick()|
    |OnLongClickListner | OnLongClick()|
    |OnFocusChangeListener| OnFocusChange()|
    |OnKeyListener | OnKey()|
    |OnTouchListener | OnTouch()|
    2.MainActivity中的changecolor方法:当用户按下时钟时候,调用该方法并接受时钟的对象,传入一个颜色对象,还有一个计数器来指向color中的索引位置
    3.实现一个监听器函数

    教材学习中的问题和解决办法

  • 问题1:
    本文主要介绍PendingIntent的做用和举例以及和Intent的区别,本文中代码见AndroidDemo@GoogleCode。
    一、PendingIntent做用
    根据字面意思就知道是延迟的intent,主要用来在某个事件完成后执行特定的Action。PendingIntent包含了Intent及Context,因此就算Intent所属程序结束,PendingIntent依然有效,能够在其余程序中使用。
    经常使用在通知栏及短信发送系统中。
    PendingIntent通常做为参数传给某个实例,在该实例完成某个操做后自动执行PendingIntent上的Action,也能够经过PendingIntent的send函数手动执行,并能够在send函数中设置OnFinished表示send成功后执行的动做。
    二、PendingIntent举例

a. 系统通知栏setLatestEventInfo表示设置点击该通知的事件工具

b. 短信系统举例
短信系统举例代码布局

private final static String SEND_ACTION      = "send";
private final static String DELIVERED_ACTION = "delivered";

private void sendSms(String receiver, String text) {
    SmsManager s = SmsManager.getDefault();
    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SEND_ACTION),
                                                      PendingIntent.FLAG_CANCEL_CURRENT);
    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED_ACTION),
                                                           PendingIntent.FLAG_CANCEL_CURRENT);
    // 发送完成
    registerReceiver(new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            switch (getResultCode()) {
                case Activity.RESULT_OK:
                    Toast.makeText(getBaseContext(), "Send Success!", Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    Toast.makeText(getBaseContext(), "Send Failed because generic failure cause.",
                                   Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    Toast.makeText(getBaseContext(), "Send Failed because service is currently unavailable.",
                                   Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:
                    Toast.makeText(getBaseContext(), "Send Failed because no pdu provided.", Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:
                    Toast.makeText(getBaseContext(), "Send Failed because radio was explicitly turned off.",
                                   Toast.LENGTH_SHORT).show();
                    break;
                default:
                    Toast.makeText(getBaseContext(), "Send Failed.", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }, new IntentFilter(SEND_ACTION));

    // 对方接受完成
    registerReceiver(new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            switch (getResultCode()) {
                case Activity.RESULT_OK:
                    Toast.makeText(getBaseContext(), "Delivered Success!", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    Toast.makeText(getBaseContext(), "Delivered Failed!", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }, new IntentFilter(DELIVERED_ACTION));

    // 发送短信,sentPI和deliveredPI将分别在短信发送成功和对方接受成功时被广播
    s.sendTextMessage(receiver, null, text, sentPI, deliveredPI);
}

以上的两个PendingIntent sentPI和deliveredPI将分别在短信发送成功和对方接受成功时被广播
三、Intent和PendingIntent的区别学习

a. Intent是当即使用的,而PendingIntent能够等到事件发生后触发,PendingIntent能够cancel

b. Intent在程序结束后即终止,而PendingIntent在程序结束后依然有效

c. PendingIntent自带Context,而Intent须要在某个Context内运行

d. Intent在原task中运行,PendingIntent在新的task中运行
PendingIntent用于描述Intent及其最终的行为.
你能够经过getActivity(Context context, int requestCode, Intent intent, int flags)系列方法从系统取得一个用于启动一个Activity的PendingIntent对象,
能够经过getService(Context context, int requestCode, Intent intent, int flags)方法从系统取得一个用于启动一个Service的PendingIntent对象
能够经过getBroadcast(Context context, int requestCode, Intent intent, int flags)方法从系统取得一个用于向BroadcastReceiver的Intent广播的PendingIntent对象
返回的PendingIntent能够递交给别的应用程序,而后继续处理。这里的话你能够稍后才处理PendingIntent中描述的Intent及其最终行为。
当你把PendingIntent递交给别的程序进行处理时,PendingIntent仍然拥有PendingIntent原程序所拥有的权限(with the same permissions and identity).当你从系统取得一个PendingIntent时,必定要很是当心才行。好比,一般,若是Intent目的地是你本身的component(Activity/Service/BroadcastReceiver)的话,你最好采用在Intent中显示指定目的component名字的方式,以确保Intent最终能发到目的,不然Intent最后可能不知道发到哪里了。一个PendingIntent就是Android系统中的一个token(节点,这个应该是Linux或C\C++用语)的一个对象引用,它描述了一些将用于retrieve的数据(这里,这些数据描述了Intent及其最终的行为)。
这就意味着即便PendingIntent原进程结束了的话, PendingIntent自己仍然还存在,可在其余进程(PendingIntent被递交到的其余程序)中继续使用.若是我在从系统中提取一个PendingIntent的,而系统中有一个和你描述的PendingIntent对等的PendingInent, 那么系统会直接返回和该PendingIntent实际上是同一token的PendingIntent,而不是一个新的token和PendingIntent。然而你在从提取PendingIntent时,经过FLAG_CANCEL_CURRENT参数,让这个老PendingIntent的先cancel()掉,这样获得的pendingInten和其token的就是新的了。
经过FLAG_UPDATE_CURRENT参数的话,可让新的Intent会更新以前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。另外,咱们也能够在PendingIntent的原进程中调用PendingIntent的cancel ()把其从系统中移除掉。

  • 问题2:使用外部类的方式实现监听事件
  • 解决方法:首先要自定义一个外部类,实现OnClickListener接口,并重写onClick方法,在onClick方法中能够定义这个外部类想实现的处理逻辑,那么调用这个外部类实现监听事件时,均可以用super来调用这个类中的处理逻辑。这也是使用外部类实现监听事件的优点所在:能够将不一样监听事件中大量重复的处理逻辑定义在这个类中,而后使用这个外部类实现监听事件时均可以使用super关键字来直接调用,而不用重复定义,减小重复代码,提升代码质量。
    为要实现监听的对象绑定监听器,而后在setOnClickListener()方法中使用咱们自定义的外部类来实现监听事件。
    重写onClick方法,并根据须要来决定是否须要使用super调用父类处理逻辑,并在onClick方法中定义本身的处理逻辑

代码调试中的问题和解决过程

  • 问题1:
  • 解决方法:minsdk至少得设为9

代码托管


运行statistic脚本文件显示学习状况,以下:

上周考试错题总结

  • 从一个活动到另外一个活动能够经过使用Intent调用startActivity方法而直接作到
  • 可见生命周期从onstart开始到onstop结束
  • 开发AndoridSDK。AVA一编你可以测试本身应用程序需不须要物理设备

    博客评论

学习进度条

教材学习 视频学习 博客量(新增/累积) 重要成长
目标 12章 20篇
第七周 第2三、2四、25章 《java和android开发学习指南》 1/1 学会使用UI组件布局和监听器使用

参考资料

java回调机制