小说来源,如今第二期项目为秋式开源公司VS插件与权力系统

 

 【声明】 

【声明】 

秋式开源公司Winform组简介:

迎接转发,但请保留小说原来出处→_→ 

迎接转发,但请保留小说原来出处→_→ 

秋式开源集团winform组,重要承担非Web内容的开源项目,重要为Winfrom项目,但不止于winfom。

生命1号:http://www.cnblogs.com/smyhvae/ 

生命一号:http://www.cnblogs.com/smyhvae/ 

当前率先期品种为秋式开源公司VS插件与权力系统,本文为权力系统的急需与分析,由winform组提供。

小说来源:http://www.cnblogs.com/smyhvae/p/3959204.html 

小说来源:http://www.cnblogs.com/smyhvae/p/3960623.html

原稿刊载于:http://www.cyqdata.com/qswinform/article-detail-36354

 

 

撰写人:秋式开源公司-winform小组-何庆攀

【正文】

【正文】

假设网上好友对权力系统有趣味,欢迎关心:秋式开源公司-Winform组http://www.cyqdata.com/qswinform

Intent组件纵然不是四大组件,但却是连接四大组件的大桥,学习好这一个知识,也拾一分的首要性。

一、广播的机能和特色

 

一、什么是Intent

  • 广播的生命周期非常的短,经过调用对象–>达成onReceive–>结束,整个经过就得了了。从贯彻的复杂度和代码量来看,广播无疑是最Mini的Android
    组件,实现数次只需几行代码。广播对象被协会出来后1般只进行布罗兹castReceiver.onReceive方法,便甘休了其生命周期。所以有的时候我们能够把它作为函数看也不至于不可。
  • 和具有组件1样,广播对象也是在利用进度的主线程中被协会,所以广播对象的执行必须是要一起且急忙的。也不推荐在里边开子线程,因为反复线程还未终止,广播对象就曾经履行完成被系统销毁。倘诺要求完成壹项相比较耗费时间的工作
    , 应该经过发送 Intent 给 Service, 由 Service 来成功。
  • 每便广播到来时 , 会重新成立 BroadcastReceiver 对象 , 并且调用
    onReceive() 方法 , 执行完以往 , 该对象即被灭绝 . 当 onReceive()
    方法在 拾 秒内尚未履行完结, Android 会认为该程序无响应。

以下为正文内容:

1、Intent的概念:

 

体系的对象

提供二个调用简单、可复用性高、满足1般须要的权位管理模块。为索要对权力管理的系统节省开支本。

  • Android中提供了Intent机制来援救应用间的互动与广播发表,恐怕应用更加纯粹的布道是,Intent不仅可用以应用程序之间,也可用于应用程序内部的activity, service和broadcast
    receiver之间的相互。Intent那一个匈牙利(Hungary)语单词的本意是“指标、意向、意图”。
  • Intent是1种运维时绑定(runtime
    binding)机制,它能在程序运转的进度中接二连三五个例外的组件。通过Intent,你的顺序能够向Android表达某种请求大概愿望,Android会依照意愿的情节选用相当的零件来响应。

二、接收系统广播:

出品的用户

开发基于.net且权限管理比较复杂的系统的开发者。

activity、service和broadcast
receiver之间是通过Intent举行通讯的,而别的四个零部件Content
Provider自己正是1种通信机制,不需求通过Intent。我们来看上边那一个图就知道了:

广播接收器能够专断地对协调感兴趣的播音进行注册,这样当有照应的播放发出时,广播接收器就能吸收接纳该广播,并在里边处理相应的逻辑。注册广播的点子有三种,在代码中注册和在清单文件中注册,前者称为动态注册,后者称为静态注册。

限制条件

权限管理项目要能够和现在开发种类衔接,做到权限系统和之后的行使系统完全分离。

图片 1

一、动态注册监听网络生成:

短语解释

短语

解释

产品

权限管理系统

系统

权限管理系统

外部系统

使用权限管理系统的系统

用户

外部系统的用户

管理员

权限管理系统的管理员

资源

外部系统的某项数据

资源操作

外部系统对资源的处理(需要授权)

资源权限

外部系统对资源操作的一个度量值(参数)

资源操作参数

代表资源权限

权限

产品内部定义的一个实体类

前置条件

成功执行用例的前置条件

后置状态

成功执行用例的的后置状态

主流程

成功执行用例的主要流程

 

若果Activity一须求和Activity二进行关联,贰者不必要直接挂钩,而是通过Intent作为桥梁。通俗来讲,Intnet类似于中介、媒婆的剧中人物。

新建筑工程程文件,首先在MainActivity中定义2个之中类netWorkChangeReceiver,天公地道写父类的onReceive()方法,那样每当网络状态发生变化时,onReceive()方法就会拿走执行,那里运用Toast提示壹段文本音信,代码如下:

谜底与假如

 

class netWorkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
        }        
    }

假设

a:基于RBAC模型完结用户与财富权限的关系。

权限管理RBAC域模型图:

图片 2

叠加表明:

一.      
角色与组都达成持续,在层层继承中一经多延续则提升查询时开支的时刻、空间比较大,所以只选拔单继承。

二、对于向那二种组件发送intent有分歧的机制:

随后在onCreate方法中实行动态注册,然后在onDestroy方法中进行废除注册:

工作范围

  • 采取Context.startActivity() 或
    Activity.startActivityForResult(),传入叁个intent来运维3个activity。使用
    Activity.setResult(),传入3个intent来从activity中回到结果。
 1     private IntentFilter intentFilter;
 2     private netWorkChangeReceiver netWorkChangeReceiver;
 3     
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.activity_main);
 8         
 9         //动态注册:创建一个IntentFilter的实例,添加网络变化的广播(功能是对组件进行过滤,只获取需要的消息)
10         intentFilter = new IntentFilter();
11         intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
12         //创建NetWorkChangeReceiver的实例,并调用registerReceiver()方法进行注册
13         netWorkChangeReceiver = new netWorkChangeReceiver();
14         registerReceiver(netWorkChangeReceiver, intentFilter);
15         
16     }
17 
18     //取消注册,一定要记得,不然系统会报错
19     @Override
20     protected void onDestroy() {
21         super.onDestroy();
22         unregisterReceiver(netWorkChangeReceiver);
23     }

系统工作数流图:

上边代码解释如下:

图片 3

叠加表达:

二.      
与权力管理种类彼此的外部系统可按交互格局分为三类:用户管理系统财富权限管理体系、能源权限消费者。

叁.      
须要管理员给用户分配能源权限。

 

  • 将intent对象传给Context.startService()来运转1个service只怕传新闻给叁个周转的service。将intent对象传给
    Context.bindService()来绑定三个service。

1一行:给意图过滤器intentFilter添加二个值为android.net.conn.CONNECTIVITY_CHANGE的action。因为每当互连网状态爆发变化时,系统就会发生一条值为android.net.conn.CONNECTIVITY_CHANG的广播。

出品范围

注:最后要记得,动态注册的播报接收器一定要注销注册才行。

运转环境

权力系统运营环境上下文(图):

图片 4

外加表达:

壹.      
权限管理种类在.net平台上,供同处一主机上的别的系统调用(包含产品自带的军管种类的UI)。

二.      
产品可实现对不在同1主机上的系统互相接口。(注:此产品接口能够是扩吉安努能,因为此接口的法力雷同能够由同样主机的别样系统提供,即能够留下产品的使用者开发。)

  • 将intent对象传给
    Context.send布罗兹cast(),Context.sendOrdered布罗兹cast(),恐怕Context.sendSticky布罗兹cast()等广播方法,则它们被传给 broadcast
    receiver。

运作程序,就足以了。

作业用例

权力管理业务用例图:

图片 5

外加表明:

1.      
图中外部系统中的五个子系统是比照外部系统访问本系统的措施而区分,是从本系统的角度区分,和表面系统的子系统划分未有早晚的涉嫌,在外部系统中未必会区分那八个实体。

遗闻假诺a(见真情与假使)可把“使用户与财富操作关联”用例细分为以下多少个用例:

图片 6

叠加表达:

一.      
图中权限系统的管理员划分是服从系统的干活流程来划分,是系统实际存在的实体。

二、Intent的连锁属性:

然而只是提醒互联网发生变化还不够人性化,为了可以准确的告知用户眼下是有网络也许不曾网络,大家还亟需对上述代码进一步优化,修改netWorkChangeReceiver中的代码如下:

用例叙述

注:在本文书档案的左右文中的用例叙述中,前置条件、主流程、后置状态没有非凡表达则都以指依照成功实践用例的情形。如放置条件是指:能成功举办用例的放到条件。

Ø 
用例:**累加财富操作参数**

放置条件:外部系统全数新的(还未存入系统中的)能源操作。

主流程:

一.      
外部系统触发添加能源操作参数操作,用例早先。

二.      
外部系统获得执行此用例的操作权限。

三.      
外部系统传入将要添加的财富操作参数。

四.      
系统判断传入的数据的合法性。

伍.      
系统将收到到的能源操作参数保存到系统的积存系统中。

陆.      
把进行操作的果再次回到给外部系统。

7.      
结束。

前置状态:系统的贮存系统投入了新的能源操作参数。

叠加相关用例:查询、修改、删除财富操作参数,用例叙述略。

 

Ø 
用例:**累加用户**

置于条件:外部系统具备新的(还未存入权限系统中的)用户。

主流程:

一.      
外部系统触发添加用户操作,用例开头。

二.      
外部系统获得执行此用例的操作权限。

三.      
外部系统传入想要添加的用户音讯。

肆.      
系统判断传入的数指标合法性。

伍.      
系统将选取到的能源操作保存到系统的仓库储存系统中。

6.      
把举行操作的果重返给外部系统。

7.      
结束。

后置状态:系统的囤积系统投入了新的用户讯息。

叠加相关用例:查询、修改、删除用户,用例叙述略。

 

Ø 
用例:**询问用户对应的能源操作参数**

内置条件:用户、财富操作参数已经分别被添参预系列的储存系统中,且两者已经依照系统的情势确立起涉嫌。

主流程:

一.      
某用户在表面系统中校要进行某个能源操作时,此用例初步。

二.      
外部系统输入用户的必备消息和要实践的财富操作(参数的标识符)的范围。

3.      
判断用户的合法性。

四.      
系统重返在钦赐询问范围中,用户所负有的财富操作(参数)集。

5.      
结束。

前置状态:用户获得其对应的能源操作参数。

 

注:以下用例是依据固然a(见真情与假若)而获得的用例(非必需的用例)的叙说。

Ø 
用例:**论及财富权限到权力**

放置条件:要涉及的财富权限已经被添参加的类别的贮存系统。

主流程:

1.      
权限管理员获得其权力,并触及关联能源到权力的操作,用例初叶。

2.      
钦定1些(已有的)财富操作参数。

三.      
钦赐1些(原有的要么新建的)权限(实体)。

四.      
将点名的能源操作参数关联到内定的权位上。

5.      
结束。

前置状态:钦赐的权杖(实体)拥有钦赐的财富操作参数。

 

Ø 
用例:**权力管理**

放置条件:无

主流程:

壹.      
权限管理员得到其权力。

二.      
对权力的增、删、查、改。

3.      
结束。

后置状态:权限集有所改变。

 

Ø 
用例:**论及权限到剧中人物**

放到条件:要涉及的权能已经被权力管理员添参与库。

主流程:

一.      
剧中人物管理员获得其权力,并触及关联权限到剧中人物的操作,用例起先。

贰.      
内定一些(已部分)权限。

3.      
钦命一些(原有的恐怕新建的)剧中人物。

肆.      
将钦赐的权位关联到钦定的剧中人物上。

5.      
结束。

前置状态:钦定的剧中人物有所内定的权力。

 

Ø 
用例:**涉嫌剧中人物到剧中人物(剧中人物间的继续)**

放到条件:无

主流程:

壹.      
剧中人物管理员得到其权力,并触及关联剧中人物到剧中人物的操作,用例伊始。

2.      
内定一个(原有的)父角色。

三.      
钦点1些(原有的)子剧中人物。

四.      
判断子剧中人物是不是有父剧中人物。

伍.      
判断父角色是或不是有一连所选的子剧中人物。

陆.      
关联所选子剧中人物到父剧中人物。

7.      
结束

前置状态: 子剧中人物继续父脚色,子剧中人物有所父剧中人物的权力。

格外流程一:

壹.      
在主流程中的第五步判断中,若是子剧中人物有父节点(剧中人物),则运行该尤其流程。

贰.      
提醒不一致意多三番五次的违法操作音讯。

3.      
结束。

 

不行流程二:

一.      
在主流程中的第陆步判断中,假如父剧中人物是某选定子节点的的子孙节点,则运转该特别流程。

二.      
提醒不允许直接或接的父节点继承于它们的子节点的违规操作音信。

3.      
结束。

附:*万分流程1是为着有限帮忙角色间不设有多一连的关联。借使能化解多一连中查询父节点集的频率难点,则足以思量完结剧中人物间的多继承关系。

*老大流程2是为了确定保障角色间不设有继承环,如:a继承b,b继承c,c继承a。

 

Ø 
用例:**剧中人物管理**

放置条件:无

主流程:

壹.      
剧中人物管理员得到其权力。

二.      
对剧中人物的增、删、查、改。

3.      
结束。

前置状态:剧中人物集有所改变。

附:在完成删、改时要注意剧中人物树的处理。

 

Ø 
用例:**事关剧中人物到组**

嵌入条件:要提到的剧中人物早已被父组的管理人添加到日前组中。

主流程:

①.      
当前组管理员获得其权力,并触及关联剧中人物到组的操作,用例早先。

二.      
钦命1些(当前组拥有的)剧中人物。

三.      
钦定1些(当前组拥有的)子组。

四.      
将点名的剧中人物关系到钦点的组上。

5.      
结束。

前置状态:钦命的子组拥有钦点的剧中人物。

附:因为该用例的停放条件中知每种组节点都留存“父组”,父组又存在父组,所以至少有壹组并未有存在父组,而未有父组则不满意前置条件。为了化解那个标题,大家得以在系统中暗中同意的成立三个一流组,并为这些一流组钦定1个组管理员(系统里面用户)。那几个一级组拥有系统中有所非系统暗中认可的剧中人物(把那特权设成系统暗中同意创设的1个角色,那样能够再分配给其子组),系统中的全数组都以超级组的子孙组(子组或直接子组)。

 

Ø 
用例:**管理组**

放置条件:无

主流程:

①.      
组管理员获得其权力。

贰.      
对子组的增、删、查、改。

3.      
结束。

前置状态:子组集有所改变。

附:扩展子组时组管理员会成为子组管理员之1。

 

Ø 
用例:**管理组成员**

内置条件:无

主流程:

一.      
组管理员得到其权力。

2.      
*活动组中的非管理员或子孙组中的成员到钦点的子组或本组。*内定、移除子组成员为其所在组的管理人。

3.      
结束。

前置状态:组员的照应剧中人物获得了重新分配。

附:管理员无法把组成员移除到组外,因为组成员和组管理员都属于父组成员,从父组的角度来看,组员之间是不能够相互删除,那样也制止的恶心的荒唐的操作,也足以兑现职者分块化。假如要彻底删除某用户则要求用户管理员或外部用户管理种类权限,要是想要收缩或不给其剧中人物,则可以新建三个子组分配给其适用的角色,把组成员移入新建的组。

 

Ø 
用例:**关系用户到组**

内置条件:要提到的用户已经被添加入的种类的储存系统。

主流程:

壹.      
用户管理员获得其权力,并触及关联用户到组的操作,用例先导。

二.      
钦定1些(已有些)用户。

3.      
钦点一个(已有个别)组。

肆.      
将钦定的用户关联到钦点的组上。

5.      
结束。

后置状态:钦命的权力(实体)拥有钦赐的财富操作参数。

 

Ø 
用例:**治本种类用户**

松开条件:无

主流程:

1.      
用户管理员得到其权力。

2.      
增、删、查、改系统里面包车型客车用户(一般是系统一管理理员)。

3.      
线束。

前置状态:系统的领队(数量与事权)有所变更。

  • Intent由以下顺序组成部分:
  • component(组件):目标组件
  • action(动作):用来彰显意图的行动
  • category(种类):用来表现动作的类别
  • data(数据):表示与动作要控制的多少
  • type(数据类型):对于data范例的抒写
  • extras(扩张音信):扩充消息
  • Flags(标志位):期望以此意向的运营方式
 1     class netWorkChangeReceiver extends BroadcastReceiver {
 2         
 3         @Override
 4         public void onReceive(Context context, Intent intent) {
 5             //通过getSystemService()方法得到connectionManager这个系统服务类,专门用于管理网络连接
 6             ConnectivityManager connectionManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
 7             NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
 8             if(networkInfo != null && networkInfo.isAvailable()){
 9                 Toast.makeText(context, "network is available",Toast.LENGTH_SHORT).show();
10             }else{
11                 Toast.makeText(context, "network is unavailable",Toast.LENGTH_SHORT).show();
12             }
13                 
14         }
15     }

Intent类型分为显式Intent(直接类型)、隐式Intent(直接类型)。官方建议利用隐式Intent。上述特性中,component属性为直接类型,别的均为直接类型。

上边代码解释:

对待与显式Intent,隐式Intnet则含蓄了成都百货上千,它并不显然提议大家想要运维哪三个活动,而是钦命一名目繁多更为抽象的action和category等音信,然后交由系统去分析那几个Intent,并帮我们找出适合的移动去运转。

06行:在onReceive()方法中,首先通过通过getSystemService()方法获得connectionManager那么些系统服务类,专门用来管理互联网连接。

Activity 中 Intent Filter 的相称进度:

07行:然后调用它的getActiveNetworkInfo()方法能够获得NetworkInfo的实例,接着调用NetworkInfo的isAvailable()方法,就足以看清当前是不是有互联网了,最后通过Toast提醒用户。

图片 7

其它,查询系统的互连网状态是内需表达权限的,打开清单文件,添加如下权限:

 

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

壹、component(组件):指标组件

注:访问http://developer.android.com/reference/android/Manifest.permission.html能够查看Android系统具备的可表明的权能。

Component属性显然内定Intent的靶子组件的类名称。(属于直接Intent)

方今运作程序,就能够了。

假使component那些本性有钦赐的话,将直接使用它钦点的机件。钦点了那么些性格现在,Intent的别的具有属性都是可选的。

上边程序完整版代码如下:

例如,运维第3个Activity时,大家得以这么来写:

图片 8图片 9

 1         button1.setOnClickListener(new OnClickListener() {            
 2             @Override
 3             public void onClick(View v) {
 4                 //创建一个意图对象
 5                 Intent intent = new Intent();
 6                 //创建组件,通过组件来响应
 7                 ComponentName component = new ComponentName(MainActivity.this, SecondActivity.class);
 8                 intent.setComponent(component);                
 9                 startActivity(intent);                
10             }
11         });
 1 package com.example.m05_broadcastreceiver01;
 2 import android.app.Activity;
 3 import android.content.BroadcastReceiver;
 4 import android.content.Context;
 5 import android.content.Intent;
 6 import android.content.IntentFilter;
 7 import android.net.ConnectivityManager;
 8 import android.net.NetworkInfo;
 9 import android.os.Bundle;
10 import android.widget.Toast;
11 public class MainActivity extends Activity {
12     private IntentFilter intentFilter;
13     private netWorkChangeReceiver netWorkChangeReceiver;
14     @Override
15     protected void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.activity_main);
18         // 动态注册:创建一个IntentFilter的实例,添加网络变化的广播
19         intentFilter = new IntentFilter();
20         intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
21         // 创建NetWorkChangeReceiver的实例,并调用registerReceiver()方法进行注册
22         netWorkChangeReceiver = new netWorkChangeReceiver();
23         registerReceiver(netWorkChangeReceiver, intentFilter);
24     }
25     // 取消注册,一定要记得,不然系统会报错
26     @Override
27     protected void onDestroy() {
28         super.onDestroy();
29         unregisterReceiver(netWorkChangeReceiver);
30     }
31     class netWorkChangeReceiver extends BroadcastReceiver {
32         @Override
33         public void onReceive(Context context, Intent intent) {
34             //通过getSystemService()方法得到connectionManager这个系统服务类,专门用于管理网络连接
35             ConnectivityManager connectionManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
36             NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
37             if(networkInfo != null && networkInfo.isAvailable()){
38                 Toast.makeText(context, "network is available",Toast.LENGTH_SHORT).show();
39             }else{
40                 Toast.makeText(context, "network is unavailable",Toast.LENGTH_SHORT).show();
41             }
42                 
43         }
44     }
45 }

万一写的不难一点,监听事件onClick()方法里能够如此写:

View Code 

1                 Intent intent = new Intent();
2                 //setClass函数的第一个参数是一个Context对象
3                 //Context是一个类,Activity是Context类的子类,也就是说,所有的Activity对象,都可以向上转型为Context对象
4                 //setClass函数的第二个参数是一个Class对象,在当前场景下,应该传入需要被启动的Activity类的class对象
5                 intent.setClass(MainActivity.this, SecondActivity.class);
6                 startActivity(intent);    

 

再简单一点,能够如此写:(当然,也是最常见的写法)

2、静态注册达成开机运营:

1                 Intent intent = new Intent(MainActivity.this,SecondActivity.class);
2                 startActivity(intent);

动态注册的点子相比较灵活,但缺点是:必须在先后运行之后才能接到到广播,因为登记的逻辑是写在onCreate()方法中的。为了让程序在未运维的情形下就能接收到广播,那里就须求采用到静态注册。

 

此间大家准备让程序接收一条开机广播,当接到那条广播时,就可以在onReceive()方法中进行相应的逻辑,从而达成开机运行的效益。

 

新建叁个类:BootCompleteReceiver,让她继续布RhodescastReceiver,在onReceive()方法中简易地Toast一下,代码如下:

二、Action(动作):用来呈现意图的行动

public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show();
    }
}

当常常生活中,描述二个心愿或希望的时候,总是有三个动词在其间。比如:笔者想“做”八个俯卧撑;小编要“写”
壹封情书,等等。在Intent中,Action就是描述做、写等动作的,当你指明了3个Action,执行者就会安分守己本条动作的指令,接受相关输入,表现对应行为,爆发符合的出口。在Intent类中,定义了一堆量的动作,比如ACTION_VIEW,ACTION_PICK等,
基本包括了常用动作。加的动作越多,越规范。

能够看到,那里不再使用在那之中类的办法来定义广播接收器,因为稍后我们供给在清单文件AndroidManifest.xml中校这一个广播接收器的类名注册进去。

Action
是3个用户定义的字符串,用于描述二个 Android 应用程序组件,五个 Intent
Filter 能够涵盖四个 Action。在 AndroidManifest.xml 的Activity
定义时,能够在其 <intent-filter
>节点钦命2个 Action列表用于标识
Activity 所能接受的“动作”。

接下来修改清单文件AndroidManifest.xml,代码如下:

 

 1 <uses-sdk
 2         android:minSdkVersion="8"
 3         android:targetSdkVersion="16" />
 4     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
 5     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
 6 
 7     <application
 8         android:allowBackup="true"
 9         android:icon="@drawable/ic_launcher"
10         android:label="@string/app_name"
11         android:theme="@style/AppTheme" >
12         <activity
13             android:name="com.example.m05_broadcastreceiver01.MainActivity"
14             android:label="@string/app_name" >
15             <intent-filter>
16                 <action android:name="android.intent.action.MAIN" />
17 
18                 <category android:name="android.intent.category.LAUNCHER" />
19             </intent-filter>
20         </activity>
21         
22         <receiver android:name=".BootCompleteReceiver">
23             <intent-filter >
24                 <action android:name="android.intent.action.BOOT_COMPLETED"/>
25             </intent-filter>
26         </receiver>
27     </application>

3、category(种类):用来表现动作的品类

代码解释如下:

Category属性也是用作<intent-filter>子成分来声称的。例如:

归根结蒂,<application>标签内多了个子标签<receiver>,全部的静态注册的播报接收器都是在此地展开挂号的。

<intent-filter>

22行:name中为广播接收器的名字

  <action
android:name=”com.vince.intent.MY_ACTION”></action>

二4行:想要接收的播放。Android系统运营完成后,会生出那条名叫android.intent.action.BOOT_COMPLETED的广播。

  <category
android:name=”com.vince.intent.MY_CATEGORY”></category> 

0五行:监听系统开机广播需求申明权限。

  <category
android:name=”android.intent.category.DEFAULT”></category> 

运维程序后,将手提式有线电话机关机重启,就能接过那条广播了。

</intent-filter>   

 

Action
和category平常是放在1起用的,所以那里一起介绍一下。大家来先来举2个例子:

三、发送自定义广播

新建三个工程文件smyh00陆_Intent01,在默许文件的底子之上,新建文件SecondActicity.java和activity_second.xml。

一、发送正式广播  

随后,大家要到清单文件中展开挂号,打开AndroidManifest.xml,添加SecondActivity的action和category的过滤器:

新建工程文件。在发广播在此以前,大家先定义三个播放接收器来收取此广播才行。因而,新建1个类:My布RhodescastReceiver,让她一而再BroadcastReceiver,代码如下:

1         <activity 
2             android:name=".SecondActivity">
3             <intent-filter>
4                  <action android:name="com.example.smyh006intent01.MY_ACTION"/>
5                  <category android:name="android.intent.category.DEFAULT" />
6             </intent-filter>            
7         </activity>
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
    }
}

上边代码,表示SecondActicity能够相配第伍行的MY_ACTION那些动作,此时,假诺在别的的Acticity通过那些action的原则来查找,那SecondActicity就具有了那些原则。类似于相亲时,笔者供给对方有何样原则,然后对方那几个SecondActicity恰巧知足了那一个规则(够通俗了呢)。

此处,当MyBroadcastReceiver
收到自定义的播音时,就会履行onReceive()方法中的逻辑,弹出四个Toast。

注:倘使未有点名的category,则必须使用暗中同意的DEFAULT(即上方第五行代码)。

跟着,要在清单文件AndroidManifest.xml中对那几个广播接收器举办注册:

也正是说:只有<action>和<category>中的内容还要能够合作上Intent中钦定的action和category时,那么些活动才能响应Intent。假设采用的是DEFAULT那种暗许的category,在稍后调用startActivity()方法的时候会活动将以此category添加到Intent中。

 1     <application
 2         android:allowBackup="true"
 3         android:icon="@drawable/ic_launcher"
 4         android:label="@string/app_name"
 5         android:theme="@style/AppTheme" >
 6         <activity
 7             android:name="com.example.m05_broadcastreceiver02.MainActivity"
 8             android:label="@string/app_name" >
 9             <intent-filter>
10                 <action android:name="android.intent.action.MAIN" />
11 
12                 <category android:name="android.intent.category.LAUNCHER" />
13             </intent-filter>
14         </activity>
15         
16         <receiver android:name=".MyBroadcastReceiver">
17             <intent-filter >
18                 <action android:name="com.example.m05_broadcastreceiver02.MY_BROADCAST"/>
19             </intent-filter>
20         </receiver>
21     </application>

目前来修改MainActivity.java中按钮的点击事件,代码如下:

代码解释:

 1         button1.setOnClickListener(new OnClickListener() {            
 2             @Override
 3             public void onClick(View v) {
 4                 //启动另一个Activity,(通过action属性进行查找)
 5                 Intent intent = new Intent();
 6                 //设置动作(实际action属性就是一个字符串标记而已)
 7                 intent.setAction("com.example.smyh006intent01.MY_ACTION"); //方法:Intent android.content.Intent.setAction(String action)
 8                 startActivity(intent);        
 9             }
10         });

1捌行:让MyBroadcastReceiver接收一条值为om.example.m0伍_broadcastreceiver02.MY_BROADCAST的播音,因此待会儿在出殡和埋葬广播的时候,大家就须要发出如此的一条广播。

上边代码中,也得以换来上边那种简洁的点子:

随即,修改activity.xml中的代码,添加三个按钮Button。

1         button1.setOnClickListener(new OnClickListener() {            
2             @Override
3             public void onClick(View v) {
4                 //启动另一个Activity,(通过action属性进行查找)
5                 Intent intent = new Intent("com.example.smyh006intent01.MY_ACTION");//方法: android.content.Intent.Intent(String action)                
6                 startActivity(intent);        
7             }
8         });

下一场,修改MainActivity.java中的代码,添加Button的监听事件:点击按钮时,发送广播

上面第4行代码:在那些Intent中,小编并未点名具体哪一个Activity,作者只是钦点了几个action的常量。所以说,隐式Intent的功力就显示的淋漓了。此时,点击MainActicity中的按钮,就会跳到SecondActicity中去。

 

上述情形只有SecondActicity相称成功。借使有三个零部件相称成功,就会以对话框列表的法子让用户进行分选。咱们来详细介绍一下:

        Button button1=(Button)findViewById(R.id.button1);
        button1.setOnClickListener(new OnClickListener() {            
            @Override
            public void onClick(View v) {
                Intent intent =new Intent("com.example.m05_broadcastreceiver02.MY_BROADCAST");
                sendBroadcast(intent);
            }
        });

我们新建文件ThirdActicity.java和activity_third.xml,然后在清单文件AndroidManifest.xml中添加ThirdActivity的action和category的过滤器:

小结:能够看看,点击按钮时,发送com.example.m0伍_broadcastreceiver02.MY_BROADCAST那条广播,这样,全数能够监听com.example.m0伍_broadcastreceiver02.MY_BROADCAST那条广播的播音接收器就都会同时吸收新闻,此时发出去的正是一条标准广播,即无序广播。所以接下去就须求讲到有序广播。

1         <activity 
2             android:name=".ThirdActivity">
3             <intent-filter>
4                  <action android:name="com.example.smyh006intent01.MY_ACTION"/>
5                  <category android:name="android.intent.category.DEFAULT" />
6             </intent-filter>            
7         </activity> 

 

那儿,运行程序,当点击MainActivity中的按钮时,弹出如下界面:

2、发送有序广播:

图片 10

广播是一种可以跨进程的通讯格局,别的应用程序是足以选择的。以往我们来发一条有序广播。

深信大家看看了这一个界面,应该就一目理解了。于是大家能够做出如下计算:

不变广播不仅有先后顺序,而且前面包车型客车广播还能将前边的播音截断。

在自定义动作时,使用activity组件时,必须添加1个暗许的品种

在叁.一的代码基础之上,将按钮的监听事件修改如下:

实际的兑现为:

1         Button button1=(Button)findViewById(R.id.button1);
2         button1.setOnClickListener(new OnClickListener() {            
3             @Override
4             public void onClick(View v) {
5                 Intent intent =new Intent("com.example.m05_broadcastreceiver02.MY_BROADCAST");
6                 sendOrderedBroadcast(intent, null);
7             }
8         });

<intent-filter>

快要0陆行代码修改一下,将send布罗兹cast()方法改为sendOrdered布罗兹cast()方法,sendOrdered布罗兹cast()方法接收五个参数,第二个参数是3个与权力相关的字符串,那里流传null即可。

               <action
android:name=”com.example.action.MY_ACTION”/>

继之,修改清单文件AndroidManifest.xml中对播音接收器的注册,设置优先级:

               <category
android:name=”android.intent.category.DEFAULT”/>

1         <receiver android:name=".MyBroadcastReceiver">
2             <intent-filter android:priority="100">
3                 <action android:name="com.example.m05_broadcastreceiver02.MY_BROADCAST"/>
4             </intent-filter>
5         </receiver>

</intent-filter>

即添加第0贰行代码。能够见到,通过android:priority属性给广播接收器设置了先行级。那天性情的限量在-1000到一千,数值越大,优先级越高。

万壹有三个零部件被相称成功,就会以对话框列表的点子让用户展开分选。

接下去,假使想要拦截这些广播,幸免让前边的播报接收器也接到到了那些广播。能够修改My布罗兹castReceiver中的代码:

各类Intent中只好钦赐二个action,但却能钦赐三个category;系列越来越多,动作越具体,意图越强烈(类似于相亲时,给对方提了累累渴求)。

1 public class MyBroadcastReceiver extends BroadcastReceiver {
2 
3     @Override
4     public void onReceive(Context context, Intent intent) {
5         Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
6         abortBroadcast();//拦截广播,防止后面的接收到
7     }
8 }

眼前大家的Intent中唯有二个私下认可的category,今后得以通过intent.addCategory()方法来促成。修改MainActivity中按钮的点击事件,代码如下:

即添加第0六行代码。假使在onReceive()方法中调用了abortBroadcast()方法,就代表是将这条广播拦截,前面包车型大巴播报接收器将不恐怕再收取到。

 1         button1.setOnClickListener(new OnClickListener() {            
 2             @Override
 3             public void onClick(View v) {
 4                 //启动另一个Activity,(通过action属性进行查找)
 5                 Intent intent = new Intent();
 6                 //设置动作(实际action属性就是一个字符串标记而已)
 7                 intent.setAction("com.example.smyh006intent01.MY_ACTION"); //方法:Intent android.content.Intent.setAction(String action)
 8                 intent.addCategory("com.example.smyh006intent01.MY_CATEGORY");
 9                 startActivity(intent);        
10             }
11         });

专门关注:

既然如此在Intent中扩张了1个category,那么我们要在清单文件中去申明这些category,不然程序将不能够运维。代码如下:

  • 广播接收器的生命周期:关键在于布RhodescastReceiver中的onReceive()方法,从onReceive()里的率先行代码起始,onReceive()里的末尾一行代码截至。
  • 多少个播放到来的时候,用什么措施提示用户是最和气的吧?第一种形式是吐司,第两种格局是打招呼。注:不要使用对话框,防止中断了用户正在展开的操作。
1             android:name=".SecondActivity">
2             <intent-filter>
3                  <action android:name="com.example.smyh006intent01.MY_ACTION"/>
4                  <category android:name="android.intent.category.DEFAULT" />
5                  <category android:name="com.example.smyh006intent01.MY_CATEGORY" />
6             </intent-filter>            
7         </activity>

 

此刻,点击MainActicity中的按钮,就会跳到SecondActicity中去。

4、使用本地广播:

总结如下:

事先大家发送和吸收接纳的播音全体都以属于全局广播,即发出去的播放能够被别的任何应用程序接收到,并且大家也能够吸收接纳来自于别的任何应用程序的广播。那样一来,必然会招致安全难点。于是便有了本地广播:即只可以在本应用程序中发送和接受播放。那就要采纳到了Local布罗兹castManager那一个类来对广播实行保管。

自定义种类: 在Intent添加类别能够加上三个品类,那就供给被相配的组件必须同时满意那多少个类型,才能合营成功。操作Activity的时候,假使未有项目,须加上暗中同意种类

咱俩修改贰.第11中学动态注册广播接收器的代码,即修改MainActivity.java中的代码如下:

 

package com.example.broadcasttest;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
    private IntentFilter intentFilter;

    private LocalReceiver localReceiver;

    private LocalBroadcastManager localBroadcastManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //通过LocalBroadcastManager的getInstance()方法得到它的一个实例
        localBroadcastManager = LocalBroadcastManager.getInstance(this);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(
                        "com.example.broadcasttest.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);//调用sendBroadcast()方法发送广播
            }
        });
        //动态注册本地的广播接收器
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
        localReceiver = new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver, intentFilter);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(localReceiver);
    }

    class LocalReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "received local broadcast",
                    Toast.LENGTH_SHORT).show();
        }
    }
}

4、data(数据):表示与动作要控制的多寡

注:本地广播是心有余而力不足透过静态注册的办法来接收的。其实也截然能够清楚,因为静态注册主要便是为了让程序在未运营的状态下也能接过广播。而发送本地广播时,大家的顺序一定是早就起步了,没有供给运用到静态注册的机能。

  • Data属性是Android要访问的多寡,和action和Category申明格局相同,也是在<intent-filter>中。
  • 多个零件相称成功体现优先级高的;
    相同展现列表。

 

Data是用3个uri对象来代表的,uri代表数量的地点,属于1种标识符。经常景况下,大家使用action+data属性的结缘来讲述三个企图:做什么

伍、种种各类的广播: 

运用隐式Intent,我们不但可以运维自身程序内的运动,仍可以运行其余程序的活动,那使得Android多个应用程序之间的功力共享成为了恐怕。比如应用程序中须求显示二个网页,未有供给本人去贯彻1个浏览器(事实上也不太大概),而是只供给条用系统的浏览器来打开这一个网页就行了。

在android中有许多连串自带的intent.action,通过监听那个事件大家能够达成很多效应。

【实例】打开钦定网页:

  1. 开机:
    String BOOT_COMPLETED_ACTION
    广播:在系统运转后。那个动作被广播一次(唯有三遍)。监听:
    “android.intent.action.BOOT_COMPLETED”
  2. 对讲机拨入:
    String ANSWER_ACTION 动作:处理拨入的电话。监听:
    “android.intent.action.ANSWE昂Cora”
  3. 电量变化:
    String BATTERY_CHANGED_ACTION
    广播:充电状态,可能电池的电量发生变化。监听:
    “android.intent.action.BATTE奥迪Q3Y_CHANGED”
  4. 日期变更:
    String DATE_CHANGED_ACTION 广播:日期被转移。
    监听:“android.intent.action.DATE_CHANGED”
  5. 裁撤更新下载:
    String FOTA_CANCEL_ACTION 广播:裁撤全体被挂起的 (pending)
    更新下载。 监听:“android.server.checkin.FOTA_CANCEL”
  6. 更新开首安装:
    String FOTA_READY_ACTION 广播:更新已经被下载 能够开头设置。监听
    “android.server.checkin.FOTA_READY”
  7. 主屏幕:
    String HOME_CATEGO帕杰罗Y 种类:主屏幕(activity)。设备运营后显得的率先个 activity。
    监听:”android.intent.category.HOME”
  8. 新应用:
    String PACKAGE_ADDED_ACTION
    广播:设备上新安装了三个用到程序包。监听:
    “android.intent.action.PACKAGE_ADDED”
  9. 除去应用:
    String PACKAGE_REMOVED_ACTION
    广播:设备上剔除了3个选拔程序包。监听:
    “android.intent.action.PACKAGE_REMOVED”
  10. 显示屏关闭:
    String SCREEN_OFF_ACTION 广播:显示器被关闭。监听:
    “android.intent.action.SCREEN_OFF”
  11. 荧屏开启:
    String SCREEN_ON_ACTION 广播:显示屏已经被打开。
    监听:“android.intent.action.SCREEN_ON”
  12. 时区改变:
    String TIMEZONE_CHANGED_ACTION 广播:时区已经济体改变。监听:
    “android.intent.action.TIMEZONE_CHANGED”
  13. 时间变更:
    String TIME_CHANGED_ACTION 广播:时间已经变更(重新设置)。
    “android.intent.action.TIME_SET”
  14. 岁月流逝:
    String TIME_TICK_ACTION 广播:当前时刻已经转移(符合规律的年月流逝)。
    “android.intent.action.TIME_TICK”
  15. 进去大体积存款和储蓄方式:
    String UMS_CONNECTED_ACTION 广播:设备进入 USB 大体量存款和储蓄情势。
    “android.intent.action.UMS_CONNECTED”
  16. 脱离大容积存款和储蓄方式:
    String UMS_DISCONNECTED_ACTION 广播:设备从 USB
    大体积存款和储蓄方式剥离。 “android.intent.action.UMS_DISCONNECTED”
  17. 壁纸改变:
    String WALLPAPER_CHANGED_ACTION 广播:系统的墙纸已经济体改变。
    “android.intent.action.WALLPAPE景逸SUV_CHANGED”
  18. web搜索:
    String WEB_SEARCH_ACTION 动作:执行 web 搜索。
    “android.intent.action.WEB_SEARCH”
  19. 互连网转移:
    String CONNECTIVITY_CHANGE_ACTION
    动作:网络转移。“android.intent.action.CONNECTIVITY_CHANGE_ACTION”

MainActivity.java中,监听器部分的主干代码如下:

 

 1         button1.setOnClickListener(new OnClickListener() {            
 2             @Override
 3             public void onClick(View v) {
 4                 Intent intent = new Intent();
 5                 intent.setAction(Intent.ACTION_VIEW);
 6                 Uri data = Uri.parse("http://www.baidu.com");
 7                 intent.setData(data);                
 8                 startActivity(intent);        
 9             }
10         });

六、实例:应用动态注册,监听手提式有线电话机的电量变化。

理所当然,上方代码也得以简写成:

完整版代码如下:

1         button1.setOnClickListener(new OnClickListener() {            
2             @Override
3             public void onClick(View v) {
4                 Intent intent = new Intent(Intent.ACTION_VIEW);
5                 intent.setData(Uri.parse("http://www.baidu.com"));                
6                 startActivity(intent);        
7             }
8         });

(1)activity_main.xml代码如下:

第4行代码:指定了Intent的action是
Intent.ACTION_VIEW,表示查看的意趣,那是2个Android系统内置的动作;

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context=".MainActivity" >
10 
11     <TextView
12         android:id="@+id/textView1"
13         android:layout_width="match_parent"
14         android:layout_height="wrap_content"
15         android:textSize="30dp"
16         android:gravity="center"/>
17 
18 </LinearLayout> 

第4行代码:通过Uri.parse()方法,将贰个网站字符串解析成三个Uri对象,再调用intent的setData()方法将以此Uri对象传递进入。

(2)MainActivity.java的代码如下:

当点击按钮时,将跳到如下界面:

 1 package com.example.m05_broadcastreceiver02;
 2 
 3 import android.app.Activity;
 4 import android.content.BroadcastReceiver;
 5 import android.content.Context;
 6 import android.content.Intent;
 7 import android.content.IntentFilter;
 8 import android.os.Bundle;
 9 import android.widget.TextView;
10 
11 public class MainActivity extends Activity {
12 
13     
14     private BatteryBroadcastReceiver batteryBroadcastReceiver;
15     private TextView textView;
16     @Override
17     protected void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.activity_main);
20         textView=(TextView)findViewById(R.id.textView1);
21         
22         //动态注册监听电量的广播接收器
23         IntentFilter intentFilter = new IntentFilter();
24         intentFilter.addAction("android.intent.action.BATTERY_CHANGED");
25         batteryBroadcastReceiver = new BatteryBroadcastReceiver();
26         registerReceiver(batteryBroadcastReceiver, intentFilter);       
27     }
28     
29     //取消注册监听电量的广播接收器
30     @Override
31     protected void onDestroy() {
32         super.onDestroy();
33         unregisterReceiver(batteryBroadcastReceiver);
34     }
35 
36     //新建一个广播接收器,监听电量的变化
37     public class BatteryBroadcastReceiver extends BroadcastReceiver {
38         @Override
39         public void onReceive(Context context, Intent intent) {
40             if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {
41                 //获取当前电量
42                 int level = intent.getIntExtra("level", 0);
43                 //电量的总刻度
44                 int scale = intent.getIntExtra("scale", 100);
45                 textView.setText("电池电量为"+((level*100) / scale)+"%");
46                 
47                 //当电量低时,可以进行一些操作,例如弹出通知等
48 /*                if(level<15){
49                     do something
50                 }*/
51             }
52         }
53         
54     }
55     
56 }

图片 11

接着,在清单文件中展开权力注明:

此时,
调用的是系统暗中认可的浏览器,相当于说,只调用了这叁个组件。现在一经有多少个零件获得了相当,应该是什么动静吧?

<uses-permission android:name="android.permission.BATTERY_STATS"/>

大家修改修改清单文件中对SecondAcivity的宣示:

MainActivity.java的代码解释如下:

1         <activity 
2             android:name=".SecondActivity">
3             <intent-filter>
4                  <action android:name="android.intent.action.VIEW" />
5                  <category android:name="android.intent.category.DEFAULT" />
6                  <data android:scheme="http" android:host="www.baidu.com"/>                 
7             </intent-filter>            
8         </activity>

40至45行:固定代码,用于获取当前电量

现行反革命,SecondActivity也合营成功了,大家运转程序,点击MainActicity的按钮时,弹出如下界面供咱们挑选:

4八至50行:当电量低时,能够开始展览部分操作,例如弹出通告等

图片 12

运作后,界面如下:

大家得以总结如下:

图片 13

  • 当Intent相称成功的零件有多少个时,展现优先级高的零件,假设优先级相同,显示列表让用户本身选择
  • 先行级从-一千至一千,并且当中1个不能不为负的才使得

 

注:系统暗中同意的浏览器并不曾做出优先级证明,其事先级暗中认可为正数。

优先级的配备如下:

在清单文件中期维修改对SecondAcivity的扬言,即扩展一行代码,通过来android:priority设置优先级,如下:

1         <activity 
2             android:name=".SecondActivity">
3             <intent-filter android:priority="-1">
4                  <action android:name="android.intent.action.VIEW" />
5                  <category android:name="android.intent.category.DEFAULT" />
6                  <data android:scheme="http" android:host="www.baidu.com"/>                                  
7             </intent-filter>            
8         </activity>

注:

Data属性的注明中要钦点访问数据的Uri和MIME类型。能够在<data>成分中经过壹些天性来安装:

android:scheme、android:path、android:port、android:mimeType、android:host等,通过那些属性来对号入座一个典型的Uri格式scheme://host:port/path。例如:http://www.google.com。

 

5、type(数据类型):对于data范例的描摹

假如Intent对象中既涵盖Uri又包涵Type,那么,在<intent-filter>中也务必双方都富含才能由此测试。

Type属性用于鲜明钦点Data属性的数据类型或MIME类型,不过平常来说,当Intent不点名Data属性时,Type属性才会起效率,不然Android系统将会依照Data属性值来分析数据的花色,所以不要钦定Type属性。

data和type属性1般只需求2个,通过setData方法会把type属性设置为null,相反设置setType方法会把data设置为null,假诺想要四个属性同时设置,要使用Intent.setDataAndType()方法。

【任务】:data+type属性的使用
【实例】:播放钦赐路线的mp3文本。

切切实实如下:

新建筑工程程文件smyh00陆_Intent0贰,MainActivity.java中按钮监听事件部分的代码如下:

 1         button.setOnClickListener(new OnClickListener(){
 2             @Override
 3             public void onClick(View v) {
 4                 Intent intent = new Intent();
 5                 intent.setAction(Intent.ACTION_VIEW);
 6                 Uri data = Uri.parse("file:///storage/sdcard0/平凡之路.mp3");
 7                 //设置data+type属性
 8                 intent.setDataAndType(data, "audio/mp3"); //方法:Intent android.content.Intent.setDataAndType(Uri data, String type)
 9                 startActivity(intent);                
10             }            
11         });

代码解释:

第六行:”file://”表示查找文件,前边再添加小编的华为手提式有线电电话机存款和储蓄卡的不二等秘书籍:/storage/sdcard0,再拉长具体歌曲的途径。

第8行:设置data+type属性  

运作后,当点击按钮时,效果如下:

图片 14

上方界面中,使用的是中兴系统默许的音乐播放器。

 

陆、extras(扩大新闻):扩大音讯

是别的具有附加音信的联谊。使用extras能够为组件提供扩大音信,比如,若是要进行“发送电子邮件”这些

动作,能够将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

 

柒、Flags(标志位):期望以此打算的运行格局

3个程序运行后系统会为这么些程序分配2个task供其应用,其它同1个task里面能够具有不一样应用程序的activity。那么,同一个主次能还是不可能具备七个task?那就涉嫌到加载activity的开发银行方式,那些需求独自讲一下。

注:android中1组逻辑上在1道的activity被称作task,本人觉得能够清楚成三个activity堆栈。

 

三、Activity的开发银行情势:(面试注意)

Activity有八种运行形式:standard、singleTop、singleTask、singleInstance。可以在AndroidManifest.xml中activity标签的习性android:launchMode中安装该activity的加载形式。

  • standard方式:暗中认可的格局,以那种情势加载时,每当运转四个新的活动,必定会构造1个新的Activity实例放到重临栈(目标task)的栈顶,不管那个Activity是不是曾经存在于重返栈中;
  • singleTop形式:假使2个以singleTop形式运营的activity的实例已经存在于再次回到桟的桟顶,那么再开发银行那些Activity时,不会成立新的实例,而是录取位于栈顶的格外实例,并且会调用该实例的onNewIntent()方法将Intent对象传递到这么些实例中;

注:假如以singleTop形式运转的activity的二个实例已经存在于重返桟中,然而不在桟顶,那么它的一颦一笑和standard格局相同,也会创设多少个实例;

  • singleTask形式:那种情势下,每便运行3个activity时,系统率先会在再次回到栈中检查是或不是存在该活动的实例,假诺存在,则平素利用该实例,并把这么些运动之上的全部活动统统去掉;尽管未有意识就会创建贰个新的运动实例;

  • singleInstance方式:总是在新的任务中开启,并且这些新的使命中有且唯有那3个实例,也正是说被该实例运行的其余activity会自动运行于另一个职务中。当再次运转该activity的实例时,会重复调用已存在的职务和实例。并且会调用那么些实例的onNewIntent()方法,将Intent实例传递到该实例中。和singleTask相同,同暂时刻在系统中只会存在一个这么的Activity实例。(singleInstance即单实例)

注:后边三种方式中,各类应用程序都有谈得来的回来栈,同三个移动在不一样的回到栈中入栈时,必然是开创了新的实例。而选择singleInstance方式可以化解那几个标题,在那种方式下会有八个单身的回到栈来管理那一个运动,不管是哪贰个应用程序来访问那几个活动,都公用同1个回来栈,也就消除了共享活动实例的难题。(此时得以兑现职责之间的切换,而不是独自某些栈中的实例切换)

 

其实我们不在清单文件中设置,只在代码中经过flag来安装也是能够的,如下:

1         Intent intent = new Intent(MainActivity.this,SecondActivity.class);
2         //相当于singleTask
3         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
4         startActivity(intent);

 

 

1         Intent intent = new Intent(MainActivity.this,SecondActivity.class);
2         //相当于singleTop
3         intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
4         startActivity(intent);

 

 

三、Intent的宽广应用:

一、打开钦命网页:(直接复制的地点的代码)

MainActivity.java中,监听器部分的主干代码如下:

 1         button1.setOnClickListener(new OnClickListener() {            
 2             @Override
 3             public void onClick(View v) {
 4                 Intent intent = new Intent();
 5                 intent.setAction(Intent.ACTION_VIEW);//方法:android.content.Intent.Intent(String action)
 6                 Uri data = Uri.parse("http://www.baidu.com");
 7                 intent.setData(data);                
 8                 startActivity(intent);        
 9             }
10         });

当然,上方代码也得以简写成:

1   button1.setOnClickListener(new OnClickListener() {            
2             @Override
3             public void onClick(View v) {
4                 Intent intent = new Intent(Intent.ACTION_VIEW);
5                 intent.setData(Uri.parse("http://www.baidu.com"));                
6                 startActivity(intent);        
7             }
8         });

第4行代码:指定了Intent的action是
Intent.ACTION_VIEW,表示查看的情趣,那是二个Android系统内置的动作;

第四行代码:通过Uri.parse()方法,将3个网址字符串解析成2个Uri对象,再调用intent的setData()方法将以此Uri对象传递进入。

要么能够写成:

1         button1.setOnClickListener(new OnClickListener() {            
2             @Override
3             public void onClick(View v) {
4                 Uri uri = Uri.parse("http://www.baidu.com");
5                 Intent intent = new Intent(Intent.ACTION_VIEW,uri);//方法: android.content.Intent.Intent(String action, Uri uri)        
6                 startActivity(intent);        
7             }
8         });

 

2、打电话:

【情势一】打开拨打电话的界面:

 

1                 Intent intent = new Intent(Intent.ACTION_DIAL);
2                 intent.setData(Uri.parse("tel:10086"));
3                 startActivity(intent);  

运作程序后,点击按钮,展现如下界面:

图片 15

 

【情势2】直接拨打电话:

 

1                 Intent intent = new Intent(Intent.ACTION_CALL);
2                 intent.setData(Uri.parse("tel:10086"));
3                 startActivity(intent);

要利用那个成效亟须在布局文件中进入权限:(加一行代码)

 

1     <uses-sdk
2         android:minSdkVersion="8"
3         android:targetSdkVersion="16" />
4     <uses-permission android:name="android.permission.CALL_PHONE"/>

 

三、发送短信:

【格局1】打开发送短信的界面:action+type

 

1         Intent intent = new Intent(Intent.ACTION_VIEW);
2         intent.setType("vnd.android-dir/mms-sms");
3         intent.putExtra("sms_body", "具体短信内容"); //"sms_body"为固定内容
4         startActivity(intent); 

【格局二】打开发短信的界面(同时钦赐电话号码):action+data

 

1         Intent intent = new Intent(Intent.ACTION_SENDTO);
2         intent.setData(Uri.parse("smsto:18780260012"));
3         intent.putExtra("sms_body", "具体短信内容"); //"sms_body"为固定内容        
4         startActivity(intent);

四、播放钦点路线音乐:action+data+type

 

1         Intent intent = new Intent(Intent.ACTION_VIEW);
2         Uri uri = Uri.parse("file:///storage/sdcard0/平凡之路.mp3"); ////路径也可以写成:"/storage/sdcard0/平凡之路.mp3"
3         intent.setDataAndType(uri, "audio/mp3"); //方法:Intent android.content.Intent.setDataAndType(Uri data, String type)
4         startActivity(intent);

伍、卸载程序:action+data(例如点击按钮,卸载有些应用程序,依照包名来辨别)

注:无论是安装依然卸载,应用程序是根据包名package来识其余。

 

1         Intent intent = new Intent(Intent.ACTION_DELETE);
2         Uri data = Uri.parse("package:com.example.smyh006intent01");
3         intent.setData(data);
4         startActivity(intent);

陆、安装程序:action+data+type

 

1         Intent intent = new Intent(Intent.ACTION_VIEW);
2         Uri data = Uri.fromFile(new File("/storage/sdcard0/AndroidTest/smyh006_Intent01.apk"));    //路径不能写成:"file:///storage/sdcard0/···"
3         intent.setDataAndType(data, "application/vnd.android.package-archive");  //Type的字符串为固定内容
4         startActivity(intent);

注:第三行的不2法门不能够写成:”file:///storage/sdcard0/···”,否则报错如下:

图片 16

疑点:通过下边包车型地铁那种办法安装程序,运营时怎么会出错呢?

 

1     //通过指定的action来安装程序
2     public void installClickTwo(View view){
3         Intent intent = new Intent(Intent.ACTION_PACKAGE_ADDED);
4         Uri data = Uri.fromFile(new File("/storage/sdcard0/AndroidTest/smyh006_Intent01.apk"));    //路径不能写成:"file:///storage/sdcard0/···"
5         intent.setData(data);
6         startActivity(intent);
7     }

 

 

 

 

综合,完整版代码如下:

 

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     android:orientation="vertical"
10     tools:context=".MainActivity" >
11     <Button 
12         android:id="@+id/button1_browsePage"
13         android:layout_width="match_parent"
14         android:layout_height="wrap_content"
15         android:onClick="browsePageClick"
16         android:text="打开指定网页"/>   
17     <Button 
18         android:id="@+id/button2_openDialPage"
19         android:layout_width="match_parent"
20         android:layout_height="wrap_content"
21         android:onClick="openDialPageClick"
22         android:text="打开拨号面板"/>
23     <Button 
24         android:id="@+id/button3_dialPhone"
25         android:layout_width="match_parent"
26         android:layout_height="wrap_content"
27         android:onClick="dialPhoneClick"
28         android:text="直接拨打指定号码"/>
29     <Button 
30         android:id="@+id/button4_openMsgPage"
31         android:layout_width="match_parent"
32         android:layout_height="wrap_content"
33         android:onClick="openMsgPageClick"
34         android:text="打开发短信的界面"/>
35     
36     
37      <Button 
38         android:id="@+id/button5_sendMsg"
39         android:layout_width="match_parent"
40         android:layout_height="wrap_content"
41         android:onClick="sendMsgClick"
42         android:text="给指定的人发短信"/>  
43         
44      <Button 
45         android:id="@+id/button6_playMusic"
46         android:layout_width="match_parent"
47         android:layout_height="wrap_content"
48         android:onClick="playMusicClick"
49         android:text="播放指定路径音乐"/>      
50      
51      <Button 
52         android:id="@+id/button7_uninstall"
53         android:layout_width="match_parent"
54         android:layout_height="wrap_content"
55         android:onClick="uninstallClick"
56         android:text="卸载程序"/>    
57      <Button 
58         android:id="@+id/button8_install"
59         android:layout_width="match_parent"
60         android:layout_height="wrap_content"
61         android:onClick="installClick"
62         android:text="安装程序"/>    
63         
64     
65 </LinearLayout>

MainActivity.java代码如下:

 

 1 package com.example.m06intent01;
 2 import java.io.File;
 3 import android.app.Activity;
 4 import android.content.Intent;
 5 import android.net.Uri;
 6 import android.os.Bundle;
 7 import android.view.Menu;
 8 import android.view.View;
 9 public class MainActivity extends Activity {
10     @Override
11     protected void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.activity_main);
14     }
15     //打开指定网页
16     public void browsePageClick(View view){
17         Intent intent = new Intent(Intent.ACTION_VIEW);
18         intent.setData(Uri.parse("http://www.baidu.com/"));
19         startActivity(intent);  
20         
21     } 
22     
23     //打开拨号面板
24     public void openDialPageClick(View view){
25         Intent intent = new Intent(Intent.ACTION_DIAL);
26         intent.setData(Uri.parse("tel:10086"));
27         startActivity(intent);        
28     }
29     
30     //直接拨打指定号码
31     public void dialPhoneClick(View view){
32         Intent intent = new Intent(Intent.ACTION_CALL);
33         intent.setData(Uri.parse("tel:10086"));
34         startActivity(intent);        
35     }
36     
37     //打开发短信的界面:action+type
38     public void openMsgPageClick(View view){
39         Intent intent = new Intent(Intent.ACTION_VIEW);
40         intent.setType("vnd.android-dir/mms-sms");
41         intent.putExtra("sms_body", "具体短信内容"); //"sms_body"为固定内容
42         startActivity(intent);        
43     }   
44     
45     //打开发短信的界面(指定电话号码):action+data
46     public void sendMsgClick(View view){
47         Intent intent = new Intent(Intent.ACTION_SENDTO);
48         intent.setData(Uri.parse("smsto:18780260012"));
49         intent.putExtra("sms_body", "具体短信内容"); //"sms_body"为固定内容        
50         startActivity(intent);        
51     }      
52     
53     //播放指定路径音乐
54     public void playMusicClick(View view){
55         Intent intent = new Intent(Intent.ACTION_VIEW);
56         Uri uri = Uri.parse("file:///storage/sdcard0/平凡之路.mp3");  //路径也可以写成:"/storage/sdcard0/平凡之路.mp3"
57         intent.setDataAndType(uri, "audio/mp3"); //方法:Intent android.content.Intent.setDataAndType(Uri data, String type)
58         startActivity(intent);
59     } 
60     
61     //卸载某个应用程序,根据包名来识别
62     public void uninstallClick(View view){
63         Intent intent = new Intent(Intent.ACTION_DELETE);
64         Uri data = Uri.parse("package:com.example.smyh006intent01");
65         intent.setData(data);
66         startActivity(intent);
67     } 
68     
69     //安装某个应用程序,根据apk的文件名来识别
70     public void installClick(View view){
71         Intent intent = new Intent(Intent.ACTION_VIEW);
72         Uri data = Uri.fromFile(new File("/storage/sdcard0/AndroidTest/smyh006_Intent01.apk"));    //路径不能写成:"file:///storage/sdcard0/···"
73         intent.setDataAndType(data, "application/vnd.android.package-archive");  //Type的字符串为固定内容
74         startActivity(intent);
75     }
76     
77     
78     @Override
79     public boolean onCreateOptionsMenu(Menu menu) {
80         // Inflate the menu; this adds items to the action bar if it is present.
81         getMenuInflater().inflate(R.menu.main, menu);
82         return true;
83     }
84     
85 }

运转后,主界面如下:

图片 17

【工程文件】

链接:http://pan.baidu.com/s/1sjFdfvn

密码:qnix

相关文章