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);//接收成功的延时意图
记得要添加权限
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);//接收成功的延时意图
记得要添加权限
相关文章推荐
- android笔记(1)
- android 调用拨号返回调用界面
- Android开发之关闭和打开Speaker(扬声器)的方法
- android中handler机制+异步处理
- [Android]Activity的创建
- Android 系统常用的权限
- android各阶段目标与要求
- Android 中处理POWER/HOME流程
- Android 自定义View (一)
- Android Studio使用技巧系列教程(二)
- Android 关于OOM的解决方案
- Android开发60条技术经验总结
- Android Service自启动注意事项分析
- window下用android-ndk-r9d编译.so文件之mutex in namespace 'std' does not name a type
- Android开发技术点3——Android Studio 中Couldn't resolve resource ****(** similar errors not shown)解决方案
- MPAndroiddChart的使用
- Android定时执行02
- 从代码分析Android-Universal-Image-Loader的图片加载、显示流程
- android小技巧之不缓存的ViewPager
- Android四大组件及Intent