安卓1108_四大组件-BroadCastReceiver广播接收者 ip拨号 短信拦截 开机自启 sd卡状态 APP安装监测 有序 无序广播 帧动画 国际化 style和theme

来源:互联网 发布:java安装时校验出错了 编辑:程序博客网 时间:2024/05/10 22:27

广播接收者

浏览器的书签页面,谷歌配置成了singleTop谷歌把浏览器的浏览页面配置成singleTask,节省内存singleInstance来电页面broadcastreceiver

ip拨打电话 加权限

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>    <intent-filter >        <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>    </intent-filter>1.保存手机号    //1.获取SharedPreferences,    SharedPreferences preferences = getSharedPreferences("config", 0);    //2.通过SharedPreferences对象的edit方法获取一个Editor对象    Editor edit = preferences.edit();    //3.往Editor对象中存放数据,键值对    edit.putString("num", phonenum);    //4.提交Editor对象    edit.commit();2.修改手机号    //获取拨打的号码    String resultData = getResultData();    //1.通过Context对象获取一个SharedPreferences对象    SharedPreferences preferences = context.getSharedPreferences("config", 0);    //2.使用SharedPreferences对象获取存放的数据,键值对的方式获取    String st = preferences.getString("num", "");    //判断拨打的电话是否是长途    if(resultData.startsWith("0")){        setResultData(st+resultData);    }

在intent-filter 配置data,不需要加权限只有两种情况:

1.sd卡的状态 需要配置<data android:scheme="file"/>,不加权限 <action android:name="android.intent.action.MEDIA_UNMOUNTED" /> <action android:name="android.intent.action.MEDIA_MOUNTED" />    String action = intent.getAction();    if ("android.intent.action.MEDIA_UNMOUNTED".equals(action)) {        System.out.println("SD卡被卸载");    } else if ("android.intent.action.MEDIA_MOUNTED".equals(action)) {        System.out.println("SD卡挂载");    }2.监听app安装和卸载状态,配置<data android:scheme="package"/>,不加权限String action = intent.getAction();    if ("android.intent.action.PACKAGE_INSTALL".equals(action)) {        System.out.println("应用被安装");    } else if ("android.intent.action.PACKAGE_REMOVED".equals(action)) {        System.out.println("应用被卸载");    } else if ("android.intent.action.PACKAGE_ADDED".equals(action)) {        System.out.println("应用被安装了");    }3.用adb强制卸载adb uninstall + 应用包名

………………………………………………

短信拦截 加权限

配置清单文件,添加权限<uses-permission android:name="android.permission.RECEIVE_SMS"/> <intent-filter>       <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter>//[1]获取是谁发送短信  和短信的内容Object[] objects = (Object[]) intent.getExtras().get("pdus");    for (Object object : objects) {        //[2]创建smsmessage实例 获取短信的相关内容        SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) object);        //[3]获取短信的内容        String messageBody = smsMessage.getMessageBody();        String address = smsMessage.getOriginatingAddress();            }4.0后想让广播接收者生效 要求 1)要求第一次安装应用的时候必须有界面2)在设置页面有一个强行停止按钮,当用户点击了强行停在按钮,这时候广播接收者不生效 在4.0之前没有这样的安全设计.

手机重启 加权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/><intent-filter>    <action android:name="android.intent.action.BOOT_COMPLETED" /></intent-filter>1.接收信息Intent intent2 = new Intent(context, MainActivity.class);//当在广播里开启Activity时,不会自动新建任务栈,因为Activity维护任务栈intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent2);2.在主方法设置使后退键失效public void onBackPressed() {    //注释掉 后退键无效    //super.onBackPressed();}

特殊的广播接收者,不需要获取权限

有些操作特别频繁的广播事件 在清单文件里面注册无效 比如屏幕的锁屏和解锁

配置广播接收者的方式

1)在清单文件里面注册

2)动态的使用代码的方式去注册

当动态的注册广播接收者的时候 当Activit销毁的时候报如下错误

1.10-11 08:38:06.287: E/ActivityThread(2459): Activity com.itheima.screen.MainActivity has leaked IntentReceiver com.itheima.screen.ScreenReceiver@b64f3f48 that was originally registered here. Are you missing a call to unregisterReceiver()?

1.在MainActivity动态注册@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    screen = new Screen();    //创建意图过滤器    IntentFilter filter = new IntentFilter();    //在意图过滤器里添加action    filter.addAction("android.intent.action.SCREEN_OFF");    filter.addAction("android.intent.action.SCREEN_ON");    //动态去注册广播接收者    this.registerReceiver(screen, filter);}//当activity销毁时要取消广播接收者@Overrideprotected void onDestroy() {    unregisterReceiver(screen);    super.onDestroy();}2.接收广播public class Screen extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String action = intent.getAction();        if("android.intent.action.SCREEN_OFF".equals(action)){            System.out.println("锁屏");        }else if("android.intent.action.SCREEN_ON".equals(action)){            System.out.println("开屏");        }    }}

自定义广播

1.有序广播 一级一级往下传播,getResultData();sendOrderedBroadcast2.无序广播 类似新闻联播sendBroadcast

01无序广播

1.发送无序广播Intent intent = new Intent();intent.setAction("com.heima.app");intent.putExtra("pp", "妈妈");sendBroadcast(intent);2.接收无序广播String app = intent.getStringExtra("pp");Toast.makeText(context, "zai 按是"+ app, 1).show();

02有序广播

设置优先级priority<receiver android:name="com.heima.rice2.ProvincesReceiver" >        <intent-filter android:priority="800" >            <action android:name="com.heima.aa" />        </intent-filter></receiver>1.发送有序广播Intent intent = new Intent();intent.setAction("com.heima.aa");sendOrderedBroadcast(intent, null, null, null, 4, "习大大给每位村民发送大米1000斤", null);2.接收有序广播的内容String data = getResultData();// 修改广播的内容setResultData("习大大给每位村民发送大米200斤");//强制停止有序广播,终止下传abortBroadcast();   3.有序和无序广播特点  无序广播不可以被终止,数据不可以被修改,有序广播可以被终止数据可以被修改.终止 abortbroadabortBroadCast:阻止其他接收者接收这条广播,类似拦截,只有有序广播可以被拦截

特殊的广播接收者

屏幕的锁屏和解锁 在清单文件注册无效配置广播接收者的两种方式:1.在清单文件注册2.用代码的方式去注册 this.registerReceiver();销毁时取消注册广播接收者OnDestory当广播接收者退出时,要取消注册 unregisterceiver();

Android样式 style

[1]什么时候使用样式 当几个页面或者是几个控件长得都差不多的时候 我们就可以抽出一个样式

[2]定义样式 ,在res目录下的values下的style.xml里面定义一个样式

<style name="my_style">    <item name="android:layout_width">match_parent</item>    <item name="android:layout_height">wrap_content</item>    <item name="android:textColor">#ccff00</item>    <item name="android:textSize">40sp</item></style>

[3]应用样式

<TextView    style="@style/my_style"    android:text="嘿嘿" />

[4]主题 定义的方式和样式是一样的

[5]主题和样式的区别

★应用的范围不同,主题的应用比较大,样式作用范围比较小一般作用在控件上,主题一般应用在当前清单文件application节点下或者Activity节点上.★定义样式和主题不是必须在res下values下的style.xml上定义,可以在values下任意一个xml上定义<style name="MyTheme">    <item name="android:background">#abcdef</item></style><application    android:allowBackup="true"    android:icon="@drawable/ic_launcher"    android:label="@string/app_name"    android:theme="@style/MyTheme" ></application>主题和样式的区别:    应用的范围不同,主题应用大,样式应用范围小主题的优先级低于样式

国际化 简称I18N

实现步骤[1]在res下创建一个目录 values-en 在这个目录里面实现对应的翻译

安卓中的帧动画

DRAWABLE Animation 帧动画就是加载一些列的图片资源 一个接一个的加载

 实现的步骤 [1]在res下创建一个drawable目录  [2]在这个目录里面创建一个资源文件 并把图片导进去 格式如下<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android" >    <item android:drawable="@drawable/girl_1" android:duration="200" />    <item android:drawable="@drawable/girl_2" android:duration="200" />    <item android:drawable="@drawable/girl_3" android:duration="200" />    <item android:drawable="@drawable/girl_4" android:duration="200" />    <item android:drawable="@drawable/girl_5" android:duration="200" />    <item android:drawable="@drawable/girl_6" android:duration="200" />    <item android:drawable="@drawable/girl_7" android:duration="200" />    <item android:drawable="@drawable/girl_8" android:duration="200" />    <item android:drawable="@drawable/girl_9" android:duration="200" />    <item android:drawable="@drawable/girl_10" android:duration="200" />    <item android:drawable="@drawable/girl_11" android:duration="200" /></animation-list>[3]在mainActivity里面写对应的业务逻辑      1.在activity中新建ImageView控件    <ImageView    android:id="@+id/iv"    android:layout_width="wrap_content"    android:layout_height="wrap_content"     />    2.在onCreate中    //找到控件    ImageView iv = (ImageView) findViewById(R.id.iv);    //设置iv的背景资源  注意这个资源是我们刚刚定义好的资源    iv.setBackgroundResource(R.drawable.anim);    //获取背景资源    AnimationDrawable background = (AnimationDrawable) iv.getBackground();    //开始执行动画    background.start();芙蓉城
0 0
原创粉丝点击