活动 Intent
活动简介
手动创建过程
创建一个新的Empty Activity
,Generate Layout File
选项是创建布局文件,也就是可视化的界面,Launcher Activity
选项是将该活动设置为启动主活动
任何活动都要重写onCreate()
方法,调用父类的onCreate()
方法
创建一个layout
文件夹存放布局文件,新建Layout resource file
setContentView(R.layout.xxxlayout);
调用setContentView
方法给当前活动加载一个布局,参数是布局文件的id
<application
......
<activity android:name=".FirstActivity"></activity>
</application>
如果是主活动,还需要配置<intent-filter>
标签
<activity android:name=".FirstActivity"
android:label="This is first activity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
销毁活动使用finish()
使用Toast
Toast.makeText(FirstActivity.this, "toast context", Toast.LENGTH_SHORT).show();
参数分别是:上下文,内容,时间长短
Menu
创建menu
文件夹,新建Menu resource file
,在文件中添加item
<menu .....>
<item
android:id="@+id/add_item"
android:title="Add"/>
....
</menu>
然后重写onCreateOptionMenu()
方法
public boolean onCreateOptionMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
再定义菜单响应事件
public boolean onoptionItemSelected(MenuItem item) {
swich (item.getItemId()) {
case R.id.add_item:
.....
bread;
...
default:
}
return true;
}
活动之间的跳转
显式
首先创建活动,注册
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
intent表示就是意图
隐式
不明确指定要跳转的活动,而是指定条件,由系统分析该向哪一个活动跳转
指定的条件就是action和category信息,两者都满足的活动会是跳转目标
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START);
startActivity(intent);
}
每个intent中只能指定一个,但category可以有多个
intent.addCategory("com.example.activitytest.MY_CATEGORY");
没有响应的活动程序会崩溃
更多隐式用法
还可以调用其他程序的活动,例如浏览器,拨号等等
以浏览器为例:
修改点击事件
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com));
startActivity(intent);
ACTION_VIEW是系统内置的动作,点击可以打开浏览器
可以在<intent-filter>
里配置<data>
标签,指定当前活动能响应什么类型的数据
- android:scheme 协议
- android:host 主机
- android:path 主机名和端口后的部分
- android:mimeType 可以处理的数据类型
数据传递
向下一个活动传递数据
intent中提供一系列putExtra()
方法的重载,存放数据,启动第二个活动后,再从intent中取出来
String data = "hello";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
取出数据的凭据是键值,在第二个活动中
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
返回数据给上一个活动
使用startActivityForResult()
来启动,会在活动销毁的时候返回一个结果给上一个活动
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
1是请求码,只要是唯一值就行了
在第二个活动中写入返回逻辑
Intent intent = new Intent();
intent.putExtra("data_return", "Hello Return");
setResult(RESULT_OK, intent);
finish();
setResult()
两个参数,第一个是返回的状态结果,第二个是带有数据的intent
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returndata = data.getStringExtra("return_data");
Log.d("FirstActivity", returndata);
}
break;
default:
}
}
请求码用来判断来源
活动的临时数据保存
Activity提供一个onSavedInstanceState()
回调方法,在活动被回收之前一定会被调用,在该方法里面保存临时数据
使用Bundle类型参数
@Override
protected void onSavedInstanceState(Bundle outState) {
super.onSavedInstanceState(outState);
String tempData = "something";
outState.putString("data_key", tempData);
}
在onCreate()方法有一个Bundle参数,可以从这里恢复数据
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("data_key");
...
}
}
活动的启动模式
一共4种,standard,singletop,singleTask,singleInstance
可以在AndroidManifest.xml
中给activity指定android:launchMode
属性选择启动模式
singletop
当启动活动时活动处于返回栈的栈顶,则直接使用,不会创建新的实例,但是如果不在栈顶就会创建新的实例singleTask
该活动在整个应用程序中只存在一个实例,启动之前会在返回栈中检查是否存在,如果发现存在,会把该活动之上的活动通通出栈,知道该实例在栈顶
如果不存在则创建singleInstance
程序活动允许其他程序调用,创建单独的返回栈管理,不管哪个程序来访问该活动,共用同一个返回栈
Tips
获取当前活动信息
怎么判断当前是哪一个活动?
创建一个新类BaseActivity,继承AppCompatActivity,重写onCreate()方法,加入语句
Log.d("BaseActivity", getClass().getSimpleName());
一次退出多个程序
新建一个ActivityCollector类作为活动管理器
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
public static void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
activities.clear();
}
}
在BaseActivity中修改onCreate和onDestroy
//onCreate()
ActivityCollector.addActivity(this);
//onDestroy()
ActivityCollector.removeActivity(this);
一键退出
button3.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ActivityCollector.finishAll();
}
});
启动活动的最佳写法
public static void actionStart(Context context, String data1, String data2) {
Intent intent = new Intent(context, SecondActivity.class);
intent.putExtra("param1", data1);
intent.putExtra("param2", data2);
context.startActivity(intent);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。