ComponentName的应用_修行的橘子的博客-程序员秘密

技术标签: Android  

ComponentName,顾名思义,就是组件名称,通过调用Intent中的setComponent方法,我们可以打开另外一个应用中的Activity或者服务。

实例化一个ComponentName需要两个参数,第一个参数是要启动应用的包名称,这个包名称是指清单文件中列出的应用的包名称:
第二个参数是你要启动的Activity或者Service的全称(包名+类名),代码如下:

启动一个Activity:

package com.example.day06_intent;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{
    
    private Button button1;
    private Button button2;
    private Button button3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button1= (Button) findViewById(R.id.button1);
        button2= (Button) findViewById(R.id.button2);
        button3= (Button) findViewById(R.id.button3);

        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
        button3.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        Intent intent =new Intent();
        switch (v.getId()) {
        //ComponentName 
        //1.通过ComponentName 跳转页面(Intent的简版)
        case R.id.button1:
            ComponentName componentName1 =new ComponentName(MainActivity.this, NextActivity.class);
            intent.setComponent(componentName1);
            startActivity(intent);
            break;
        //2.跳转到另外一个app(此时另外一个app需要先启动)
        //实例化一个ComponentName需要两个参数,第一个参数是要启动应用的包名称,这个包名称是指清单文件中列出的应用的包名称:
        //  第二个参数是你要启动的Activity或者Service的全称(包名+类名)          
        case R.id.button2:
            ComponentName componentName2 =new ComponentName("com.example.day05_activity", "com.example.day05_activity.MainActivity");
            intent.setComponent(componentName2);
            startActivity(intent);
            break;
        //3.隐式跳转
        case R.id.button3:
            intent.setAction("next");
            startActivity(intent);
            break;
        default:
            break;
        }

    }

}

注意

如果你要的启动的其他应用的Activity不是该应用的入口Activity,那么在清单文件中,该Activity节点一定要加上android:exported=true,表示允许其他应用打开,对于所有的Service,如果想从其他应用打开,也都要加上这个属性:

对于除了入口Activity之外的其他组件,如果不加这个属性,都会抛出“java.lang.SecurityException: Permission Denial…..”异常

那么为什么入口Activity不用添加这个属性就可以被其他应用启动呢?我们来看一段入口Activity的注册代码:

入口Activity和普通Activity唯一不同的地方就是入口Activity多了一个过滤器,对于包含了过滤器的组件,意味着该组件可以提供给外部的其他应用来使用,它的exported属性默认为true,相反,如果一个组件不包含任何过滤器,那么意味着该组件只能通过指定明确的类名来调用,也就是说该组件只能在应用程序的内部使用,在这种情况下,exported属性的默认值是false。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hong_guorui/article/details/50580987

智能推荐

GCC编译程序出现 undefined reference to `std::ios_base::Init::Init()'问题_Vovis的博客-程序员秘密_std::ios_base::init::init()

在WINDOWS环境的CODE::BLOCKS里面写好的测试程序,想拿到Linux里面试验一把。报错: undefined reference to `std::ios_base::Init::Init()1. 确认是否安装 gcc-c++的支持库[[email protected] ~]# rpm -qa| grep gccgcc-4.8.5-11.el7.x86_64gcc-c++-

微信小程序——律师事务所微官网_DavidGhul的博客-程序员秘密

效果预览和文件结构<!--pages/case/index.wxml--><view class="page"> <!-- 设置轮换banner --> <view> <swiper indicator-dots="ture" autoplay="true" interval="5000" duration="1000"...

solr <一>用 Java客户端 建索引+分页查询_偏偏一叶扁舟的博客-程序员秘密

在 solr 3.5 配置及应用(一) 讲过一了 solr 3.5的详细配置,本节我们讲利用solr 的客户端调用solr的应用了!一、利用SolrJ操作solr API     使用SolrJ操作Solr会比利用httpClient来操作Solr要简单。SolrJ是封装了httpClient方法,来操作solr的API的。SolrJ底层还是通过使用httpClient中的方法来完

DELPHI下的Winsock编程(二)--一些基本的API函数_wudi_1982的博客-程序员秘密

    勿在浅沙筑高楼。在谈论TServerSocket等组件编写之前,这里先对Winsock中一些基本概念和API函数做一个简单的说明。 一、定址      要通过Winsock建立通信,必须了解如何利用指定的协议为工作站定址。Winsock 2引入了几个新的、与协议无关的函数,它们可和任何一个地址家族一起使用;但是大多数情况下,各协议家族都有自己的地址解析机制,要么通过一个函数,要么作为一个投

字符串与字符串模板_小耳朵CC的博客-程序员秘密

字符串的扩展字符串的扩展主要添加了一些新的方法,来解决es5中难解决的问题,同时还有模板字符串的相关用法1.字符串Unicode的表示Unicode说白了就是将字符以\u0000~\uFFFF的码点形式表示'\u0062'// b在超出或者不满足\u0000~\uFFFF这个格式的,我们都需要采取措施才能够识别\u后面不为四位需要在前面添加0补齐超出四位数的话,需要通过两个字符表示上面的问题

const变量赋值原则_爱吃甜食_的博客-程序员秘密_const变量赋值

const int **p1; int *p2; p1 = &p2; // error 非const地址无法赋值给const 指针 const int temp_1 = 4; int temp_2 = 9; const int *pt_1; int *pt_2; pt_1 = &temp_1; pt_2 = &temp_1;//error const数据地址无法赋值给非co

随便推点

go 结构体成员使用(指针变量)_JeffreyBool的博客-程序员秘密

package mainimport "fmt"//定义一个结构体类型type Student struct { id int name string sex byte //字符类型 age int addr string}func main() { //1、指针有合法指向后,才操作成...

POJ1797Heavy Transportation 最短路变形_小萨摩的博客-程序员秘密

题目:点击打开链接题意:给定n个顶点,以及m条边的描述,每条边的描述包括:起点、终点、权重。现在要从顶点1出发到达顶点n,求路径中能够承受的最大权重。首先题目的理解非常重要。本题要求出的是从顶点1到顶点n的所有可行路径中各边权值的最小值的最大值。很显然是最短路径的变形。分析:令dist[i]表示从顶点1到顶点i的可行路径中各边权值的最小值的最大值。从dist的定义出发,求出所有

MacOS下hls/rtmp直播服务器搭建(包括推流)_宋建斌的博客-程序员秘密_macos rtmp推流

一、Mac上搭建直播服务器Nginx+rtmp]步骤安装1、安装HomebrowHomebrew简称brew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,可以说Homebrew就是mac下的apt-get、yum神器/usr/bin/ruby -e "$(curl -fsSL https://raw.githubuserc

vs2017 linux调试遇到的一些问题_machuanfei_c的博客-程序员秘密

问题一:Unable to start debugging. Unexpected GDB output from command 具体如图编译的时候可以编译成功, 但是当调试的时候会报这个错。初步确定是因为没有找到对应的工作目录默认的工作目录但是我这里设置了常规里的输出目录工作目录不一致,然后就报了那个错误。解决方法:更改 调试-&gt;工作目录与常规...

fatal: pathspec 'readme.txt' did not match any files 解决办法_巷口等风的博客-程序员秘密

fatal: pathspec ‘readme.txt’ did not match any files 解决办法第一次接触git,在把文件添加到仓库时,遇到了问题看网上说用touch readme.txt可以解决,尝试了一下,添加文件的时候没报错误,但是提交的时候出了问题,结果如下图所示,还有一种说法是目录下没有readme.txt文件,建一下就可以运行了,可是明明自己建了有文件,很无...

好程序员大数据教程Hadoop全分布安装(非HA)_cique2620的博客-程序员秘密

  机器名称 启动服务  linux11 namenode secondrynamenode datanode  linux12 datanode  linux13 dat...

推荐文章

热门文章

相关标签