您的位置:首页 > 移动开发 > Android开发

android笔记(2)

2016-03-09 10:56 411 查看
1.各位android大牛的微博: http://www.zhihu.com/question/19775981

2.Intent的作用

Android中的Intent有两大作用。

一:用来启动其他新的Activity。

显式和隐式

二:作为传递数据和事件的桥梁。传递数据时的代码有两种:

第一种是:

Intent intent = new Intent(CurrentActivity.this , OtherActivity.class);

intent.putExtra(“data” , somedata);

第二种是新建一个Bundle,再把该Bundle加入intent,如:

Bundle bundle = new Bundle() ;

bundle.putString(“data” , somedata) ;

intent.putExtras(bundle)。

2.动画切换、手势切换

(1)动画切换:
overridePendingTransition(R.anim.pre_in,R.anim.pre_out);
(2)手势切换
//1.创建手势检测器
private GestureDetector gestureDetector;

gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener(){
//2、重写相应的方法,处理事件
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
if(Math.abs(velocityX) < 250){
MyUtils.showToast(SettingBaseActivity.this, "速度太慢了");
return true;
}
if(velocityX < 0){//向左滑动,下一页
next(null);
}else{//向右滑动,上一页
pre(null);
}

return super.onFling(e1, e2, velocityX, velocityY);
}
});

/**
* 响应手指触摸事件
* 返回true,表示该事件由我处理,系统就不用管了
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
//3.将触摸事件,交给手势检测工具类
gestureDetector.onTouchEvent(event);
return true;
}

3.OOM/ANR
OOM:java.lang.OutOfMemoryError

ANR: Application Not Responding
ANR一般有三种类型:

1:KeyDispatchTimeout(5 seconds) --主要类型

按键或触摸事件在特定时间内无响应

2:BroadcastTimeout(10 seconds)

BroadcastReceiver在特定时间内无法处理完成

3:ServiceTimeout(20 seconds) --小概率类型

Service在特定的时间内无法处理完成

如何避免ANR?
1、运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等)

2、应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个
Service。(此处需要注意的是可以在广播接受者中启动Service,但是却不可以在Service中启动broadcasereciver,关于原因后续会有介绍,此处不是本文重点)

3、避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。

总结:anr异常也是在程序中自己经常遇到的问题,主要的解决办法自己最常用的就是不要在主线程中做耗时的操作,而应放在子线程中来实现,比如采用Handler+mesage的方式,或者是有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等,在主线程中更新UI。

4.内容提供器

5.TelephonyManager tm;
tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
tm.getSimSerialNumber();

6.广播接收器(BroadcastReceiver)
一个类继承BroadcastReceiver,并实现onReceive方法,然后在Mainfest.xml清单文件中注册广播地址,没有注册广播地址的BroadcastReceiver就像一个缺少选台按钮的收音机,虽然功能俱备,但也无法收到电台的信号。
(1)静态注册:

<receiver
android:name="com.itheima.mobilesafe45.receiver.BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>

配置了以上信息之后,只要是android.intent.action.BOOT_COMPLETED这个地址的广播,BootCompleteReceiver都能够接收的到。注意,这种方式的注册是常驻型的,也就是说当应用关闭后,如果有广播信息传来,MyReceiver也会被系统调用而自动运行。

(2)动态注册
动态注册需要在代码中动态的指定广播地址并注册,通常我们是在Activity或Service注册一个广播

MyReceiver receiver = new MyReceiver();

IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MY_BROADCAST");

registerReceiver(receiver, filter);

注意,registerReceiver是android.content.ContextWrapper类中的方法,Activity和Service都继承了ContextWrapper,所以可以直接调用。在实际应用中,我们在Activity或Service中注册了一个BroadcastReceiver,当这个Activity或Service被销毁时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册了。所以,记得在特定的地方执行解除注册操作:

@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}

执行这样行代码就可以解决问题了。注意,这种注册方式与静态注册相反,不是常驻型的,也就是说广播会跟随程序的生命周期。

我们可以根据以上任意一种方法完成注册,当注册完成之后,这个接收者就可以正常工作了。我们可以用以下方式向其发送一条广播:

public void send(View view) {
Intent intent = new Intent("android.intent.action.MY_BROADCAST");
intent.putExtra("msg", "hello receiver.");
sendBroadcast(intent);
}

7.发送短信

SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(safeNum,//接收短信的号码
null,//短信服务中心号码
"sim is changed",//消息内容
null,//发送成功的延时意图
null);//接收成功的延时意图

记得要添加权限
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: