一. 首先检查我们的代码:
FirstActivity.java(主活动程序当中的代码):
Button3 监听器后面的代码就是我们隐式 Intent 的业务逻辑所在了, 大家可以往下面看看, 大概在代码的第 57 行.
- package com.example.lenovo.activitytest;
- import Android.support.v7.App.AppCompatActivity;
- import Android.os.Bundle;
- import Android.view.Menu;
- import Android.view.MenuItem;
- import Android.view.View;
- import Android.widget.Button;
- import Android.widget.Toast;
- import Android.content.Intent;
- public class FirstActivity extends AppCompatActivity {
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.main,menu);// 第一个参数表示我们通过哪一个资源来引用菜单当中的全部资源
- // 第二个参数表示菜单被添加到哪一个对象当中
- return true;// 这句话表示我们创建的菜单是可以显示出来的, 但是仅仅显示还是不够的, 还需要真正地让菜单上的选项起作用.
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item)// 这里定义菜单为一个响应式事件
- {
- switch (item.getItemId())
- {
- case(R.id.add_item):
- Toast.makeText(this,"你选择了增加",Toast.LENGTH_SHORT).show();
- break;
- case(R.id.remove_item):
- Toast.makeText(this,"你选择了减少",Toast.LENGTH_SHORT).show();
- break;
- default:// 这个关键字是可以不要的
- }
- return true;// 将菜单当中的显示出来
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.first_layout);
- Button button1=(Button)findViewById(R.id.button_1);
- button1.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Toast toast=Toast.makeText(FirstActivity.this,null,Toast.LENGTH_SHORT);
- toast.setText("只有傻逼才会按这个按钮");
- toast.show();// 利用这种方法就可以去掉前面的 App 名称了, 而且这种创建对象的方法也更可以令人理解
- }
- });
- Button button2=(Button)findViewById(R.id.button_2);
- button2.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Toast.makeText(FirstActivity.this,"只有不学习的人才会按这个按钮",
- Toast.LENGTH_SHORT).show();
- }
- });
- Button button4=(Button)findViewById(R.id.button_4);
- button4.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- /*Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
- startActivity(intent);
我们这里已经使用了显示 intent, 现在开始进行隐式 intent 的使用, 首先应该在 xml 当中进申明
- */// 这就是所谓的显示 intent 了, 相对于来说这已经是十分容易实现的了.
- Intent intent=new Intent("com.example.lenovo.activitytest.ACTION_START");
- startActivity(intent);
- }
- });
- Button button3=(Button)findViewById(R.id.button_3);
- button3.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
- startActivity(intent);
- }
- });
- }
- }
二. 注册在主活动上的代码需要补上:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:Android="http://schemas.android.com/apk/res/android"
- package="com.example.lenovo.activitytest">
- <application
- Android:allowBackup="true"
- Android:icon="@mipmap/ic_launcher"
- Android:label="@string/app_name"
- Android:roundIcon="@mipmap/ic_launcher_round"
- Android:supportsRtl="true"
- Android:theme="@style/AppTheme">
- <activity
- Android:name=".FirstActivity"
- Android:label="这是一个让人感到好笑的 APP">
- <intent-filter>
- <action Android:name="android.intent.action.MAIN" />
- <category Android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity Android:name=".SecondActivity"
- Android:label="这是一个严肃的 APP">
- <intent-filter><!-- 这里是一个隐式的 intent 申明 -->
- <action Android:name="com.example.lenovo.activitytest.ACTION_START"/>
- <category Android:name="android.intent.category.DEFAULT"/>
- <category Android:name="com.example.lenovo.activitytest.MY_CATEGORY"/>
- </intent-filter>
- </activity>
- </application>
- </manifest>
从中我们可以看到我们注册在 xml 界面上,<intent-filter > 后面的代码为 < action Android:name="com.example.lenovo.activitytest.ACTION_START"/>,action 中间 name 的名称一定要注意. 这个里面的名称是不能够乱写的, 这里名称将会和刚刚前面主活动当中的代码相呼应:
- Button button4=(Button)findViewById(R.id.button_4);
- button4.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- /*Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
- startActivity(intent);
我们这里已经使用了显示 intent, 现在开始进行隐式 intent 的使用, 首先应该在 xml 当中进申明
- */// 这就是所谓的显示 intent 了, 相对于来说这已经是十分容易实现的了.
- Intent intent=new Intent("com.example.lenovo.activitytest.ACTION_START");
- startActivity(intent);
- }
- });
因此我们可以看到, 里面的字符串均是 com.example.lenovo.activitytest, 不能够乱写. 这行字符串是怎么得到的呢? 我们可以在主活动当中的第一行代码当中可以找到其代码为: package com.example.lenovo.activitytest. 这样的话, 才可以进行正确地调用主活动当中的方法, 实现隐式 intent 跳转. 如果在 xml 当中仅仅写上: com.example.lenovo.activitytest.ACTION_START 的话, 这个活动在 App 进行运行的时候就不会实现正常的跳转, 从而销毁活动, 造成失灵. 这就是我们 Android Stuidio 无法实现隐式 Intent 的原因.
来源: https://www.cnblogs.com/geeksongs/p/9863795.html