大杰哥 發表於 2019-9-19 21:08:00

Android开发--Intent的使用(1)启动活动

<p>Android系统是目前世界上市场占有率最高的移动操作系统,近年来,Android开发也越来越炙手可热。</p>
<p>在Android开发中,我们使用Intent进行<span style="color: rgba(255, 0, 0, 1)"><strong>活动Activity</strong></span>之间穿梭。</p>
<p>&nbsp;</p>
<p>当我们点击启动器时,我们会直接进入该应用的主活动,但一个活动的应用未免太简单了。那么当有多个活动时,应用如何实现活动间的跳转呢?答案就是<span style="background-color: rgba(255, 255, 153, 1)">使用Intent</span>。</p>
<p>Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同的组件之间传递数据。一般被用于启动活动、启动服务以及发送广播等场景。</p>
<p>Intent的使用包括显式和隐式使用两种,下面一一介绍。</p>
<p>&nbsp;</p>
<p><span style="font-size: 18px"><strong>一、使用显式Intent</strong></span></p>
<p>  首先我们要知道如何声明一个Intent,Intent有多个构造函数,其中一个是<span style="background-color: rgba(255, 255, 153, 1)">Intent( Context packageContext, Class&lt;?&gt;cls)。</span></p>
<p>  第一个参数<span style="background-color: rgba(255, 255, 153, 1)">Context</span>要求提供一个启动活动的上下文,第二个参数<span style="background-color: rgba(255, 255, 153, 1)">Class</span>则指定想要启动的目标活动。</p>
<p>  <strong>实现活动间显式交互:</strong></p>
<p>  1. 首先给活动1中为某控件(通常是按钮)注册一个监听器,对该控件进行某操作时(通常是点击)时执行监听器中的方法(示例是<strong>onClick()</strong>)。我们Intent实现的功能自然就是在这个方法里面定义咯。</p>
<p>  2. 构建一个Intent,传入上下文和目标活动,这里是<strong>传入FirstActivity.this作为上下文,传入SecondActivity.class作为目标活动</strong>。然后通过startActivity()来执行这个Intent。</p>
<p>  3. 这样之后就实现了活动间的跳转。</p>
<p>  (因为使用这种方式来启动活动,Intent的“意图”很明显,所以称之为显式Intent)</p>
<p>&nbsp;</p>
<p>&nbsp;  <span style="font-size: 15px">下面代码实现点击FirstActivity的button跳转到SecondActivity。</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span>      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置toast触发点</span>
<span style="color: rgba(0, 128, 128, 1)">2</span>         Button button1 =<span style="color: rgba(0, 0, 0, 1)"> (Button) findViewById(R.id.button_1);//findViewById()获取在布局文件中的对象
</span><span style="color: rgba(0, 128, 128, 1)">3</span>         button1.setOnClickListener(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener(){
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 0, 1)">            @Override
</span><span style="color: rgba(0, 128, 128, 1)">5</span>             <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View v){
</span><span style="color: rgba(0, 128, 128, 1)">6</span>                Intent intent = <span style="color: rgba(0, 0, 255, 1)">new</span> Intent (FirstActivity.<span style="color: rgba(0, 0, 255, 1)">this</span>, SecondActivity.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">7</span> <span style="color: rgba(0, 0, 0, 1)">               startActivity(intent);
</span><span style="color: rgba(0, 128, 128, 1)">8</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">9</span>         });</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 18px"><strong>二、使用隐式Intent</strong></span></p>
<p>  隐式Intent并不明确指明启动哪个活动,而是指定一系列抽象的<strong>action和category</strong>等信息,然后交由系统去分析这个Intent,然后找出合适的活动去启动。那么什么是合适的活动呢?其实就是<strong>可以响应这个Intent的活动</strong>。</p>
<p>  <strong>实现隐式Intent:实现点击按钮跳转活动2(上面显式Intent一样的功能)</strong></p>
<p><strong>  </strong>1. 首先在AndroidManifest.xml中注册的活动中,在&lt;activity&gt;标签下配置&lt;intent-filter&gt;的内容,指定当前活动能够响应的action和category。</p>
<p>   在&lt;action&gt;标签中指明了当前活动可以响应com.example.myapplication.ACTION_START这个action,&lt;category&gt;包含了一些附加信息,更精确地指明了当前的活动能够响应的Intent中可能还带有的category。</p>
<p>   <strong>只有&lt;action&gt; &lt;category&gt;中的内容同时匹配Intent中指定的action和category时,这个活动才能响应该Intent</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span>         &lt;activity android:name=".SecondActivity"&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span>             &lt;intent-filter&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span>               &lt;action android:name="com.example.myapplication.ACTION_START"/&gt;
<span style="color: rgba(0, 128, 128, 1)">4</span>               &lt;category android:name="android.intent.category.DEFAULT" /&gt;
<span style="color: rgba(0, 128, 128, 1)">5</span>               &lt;category android:name="com.example.myapplication.MY_CATEGORY" /&gt;
<span style="color: rgba(0, 128, 128, 1)">6</span>             &lt;/intent-filter&gt;
<span style="color: rgba(0, 128, 128, 1)">7</span>         &lt;/activity&gt;</pre>
</div>
<p>  2. 修改FirstActivity中按钮的点击事件。使用Intent的另一个构造函数,直接将action的字符串传入。</p>
<p>   <strong>每个Intent只能指定一个action,但是可以有多个category。</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span>         button1.setOnClickListener(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener(){
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">            @Override
</span><span style="color: rgba(0, 128, 128, 1)">3</span>             <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View v){
</span><span style="color: rgba(0, 128, 128, 1)">4</span>                Intent intent = <span style="color: rgba(0, 0, 255, 1)">new</span> Intent("com.example.myapplication.ACTION_START"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">5</span>                intent.addCategory("com.example.myapplication.MY_CATEGORY"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">6</span> <span style="color: rgba(0, 0, 0, 1)">               startActivity(intent);
</span><span style="color: rgba(0, 128, 128, 1)">7</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">8</span>         });</pre>
</div>
<p>  3. 这样就实现了点击button1跳转到活动2的功能啦,只是这次我们用隐式Intent。</p>
<p>&nbsp;</p>
<p><span style="font-size: 16px"><strong>更多的隐式Intent</strong></span></p>
<p><strong>1. 点击按钮打开网页</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span>         Button button2 =<span style="color: rgba(0, 0, 0, 1)"> (Button) findViewById(R.id.button_2);
</span><span style="color: rgba(0, 128, 128, 1)">2</span>         button2.setOnClickListener(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener(){
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">            @Override
</span><span style="color: rgba(0, 128, 128, 1)">4</span>             <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View v) {
</span><span style="color: rgba(0, 128, 128, 1)">5</span>               Intent intent_1 = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Intent(Intent.ACTION_VIEW);
</span><span style="color: rgba(0, 128, 128, 1)">6</span>               intent_1.setData(Uri.parse("http://www.baidu.com"<span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 128, 128, 1)">7</span> <span style="color: rgba(0, 0, 0, 1)">                startActivity(intent_1);
</span><span style="color: rgba(0, 128, 128, 1)">8</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">9</span>         });</pre>
</div>
<p>&nbsp;  这里首先指定了Intent的action是Intent.ACTION_VIEW(这是Android系统内置的动作,其常量值为android.intent.action.view)</p>
<p>  然后通过Uri.parse()方法把网址字符串解析成一个Uri对象,再调用Intent的setData() 将这个Uri对象传递进去。</p>
<p>  (<strong>setData()</strong> 接收一个Uri对象,主要用于指定当前Intent正在操作的数据)</p>
<p>&nbsp;</p>
<p><strong>2. 选择软件进行打开操作</strong></p>
<p><strong> </strong>每当我们想打开一个word文档时,手机总会弹出一条消息,选择打开方式(即使用哪个软件打开),这个操作如何实现呢?</p>
<p> 就以上面打开网址为例介绍一下。当选择浏览器打开时,我们打开百度,当选择其他软件打开时,跳转到某一界面(后续操作省略)</p>
<p> 首先我们要知道,&lt;inter-filter&gt;标签里可以再配置一个<strong>&lt;data&gt;标签,用于更精确地指定当前活动能够响应什么类型的数据</strong>。</p>
<ul>
<li>android:scheme。用于指定数据的协议部分,如上例的http部分。</li>
<li>android:host。用于指定数据的主机名部分,如上例中的www.baidu.com部分。</li>
<li>android:port。用于指定数据的端口部分,一般紧随在主机名之后。</li>
<li>android:path。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。</li>
<li>android:mimeType。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。</li>
</ul>
<p>  <strong>只有当&lt;data&gt;标签指定的内容和Intent携带的data内容完全一致时,当前活动才能响应该Intent</strong>。</p>
<p>  下面的代码表示,当点击上例中按钮时,如果选择浏览器,将产生上例的结果,进入百度官网首页。若选择用该软件打开,则会进入到ThirdActivity。</p>
<p>  (即该Intent有两个活动可以对其进行匹配,根据个人选择进行选择)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span>         &lt;activity android:name=".ThirdActivity"&gt;
<span style="color: rgba(0, 128, 128, 1)">2</span>             &lt;intent-filter tools:ignore="AppLinkUrlError"&gt;
<span style="color: rgba(0, 128, 128, 1)">3</span>               &lt;action android:name="android.intent.action.VIEW" /&gt;
<span style="color: rgba(0, 128, 128, 1)">4</span>               &lt;category android:name="android.intent.category.DEFAULT" /&gt;
<span style="color: rgba(0, 128, 128, 1)">5</span>               &lt;data android:scheme="http" /&gt;
<span style="color: rgba(0, 128, 128, 1)">6</span>             &lt;/intent-filter&gt;
<span style="color: rgba(0, 128, 128, 1)">7</span>         &lt;/activity&gt;</pre>
</div>
<p>&nbsp;</p>
<p><strong>3. 点击按钮拨号</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span>         Button button2 =<span style="color: rgba(0, 0, 0, 1)"> (Button) findViewById(R.id.button_2);
</span><span style="color: rgba(0, 128, 128, 1)">2</span>         button2.setOnClickListener(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener(){
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">            @Override
</span><span style="color: rgba(0, 128, 128, 1)">4</span>             <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View v) {
</span><span style="color: rgba(0, 128, 128, 1)">5</span>               Intent intent_1 = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Intent(Intent.ACTION_DIAL);
</span><span style="color: rgba(0, 128, 128, 1)">6</span>               intent_1.setData(Uri.parse("tel:10086"<span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 128, 128, 1)">7</span> <span style="color: rgba(0, 0, 0, 1)">                startActivity(intent_1);
</span><span style="color: rgba(0, 128, 128, 1)">8</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">9</span>         });</pre>
</div>
<p>&nbsp;  点击按钮调用系统拨号界面,默认号码10086hhh</p><br><br>
来源:https://www.cnblogs.com/ToDL/p/11551297.html
頁: [1]
查看完整版本: Android开发--Intent的使用(1)启动活动