安卓隐式Intent启动Activity和BroadcastReceiver若干注意点
最后更新于:2022-04-01 14:43:48
隐式调用Activity和BroadcastReceiver调用方法之前已经介绍过了。今天只是来做下4个实验,假设B通过Intent隐式调用A,如果A没有一个Activity有
~~~
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
~~~
这个设置会怎么样?
下面是Activity的实验:
~~~
package com.example.intenta;
import android.app.Activity;
import android.os.Bundle;
public class ShowType extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.show_type);
}
}
~~~
上面是A的JAVA代码,下面是A的XML代码,只是定义了一个TextView
~~~
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="40sp"
android:text="启动A"
/>
</LinearLayout>
~~~
~~~
package com.example.intenta;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
~~~
上面是A的另外一个Activity的代码(A有两个Activity,通过控制在这一个Acticity在manifest是否设置android.intent.action.MAIN等条目来控制实验变量)
~~~
<activity android:name="com.example.intenta.ShowType" >
<intent-filter>
<action android:name="com.mytest.IntentA" >
</action>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.mytest.startA" />
</intent-filter>
</activity>
~~~
这是A的IntentFilter
~~~
package com.example.intentb;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener( new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setAction("com.mytest.IntentA");
intent.addCategory("com.mytest.startA");
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
~~~
这里是B的JAVA代码,通过点击按钮来隐式调用A
Activity实验结果:
1)在有设置的情况下:能够正常通过B启动A
2)没有设置的情况下:能够正常通过B启动A
实验结果分析:
Activity的Intent启动过程不受是否设置
~~~
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
~~~
下面是BroadcastReceiver的实验:
代码和上面基本类似,下面只放出A中BroadcastReceiver的代码:
~~~
package com.example.intenta;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
public class ShowType extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Toast.makeText(context, "启动A...", Toast.LENGTH_LONG).show();
}
// @Override
// protected void onCreate(Bundle savedInstanceState) {
// // TODO Auto-generated method stub
// super.onCreate(savedInstanceState);
// setContentView(R.layout.show_type);
// }
}
~~~
实验结果:
1)在有设置的情况下:B能够正常通过Intent启动A的BroadcastReceiver
2)在没有设置的情况下:失败
最后实验结果:
~~~
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
~~~
如果A中没有一个Activity有这段IntentFilter设置,那么通过Intent,B能够启动A的Activity但是不能启动A的BroadcastReceiver。