今天开始更新一下android的基本知识,下面是敲代码遇到的问题。
1)我们来谈谈android.intent.category.DEFAULT的用途。
在谈这个tag的用途之前,读者要明白什么是implicit intent还有什么是explicit intent。即什么是隐式intent还有显式intent。
我想这个问题不难。如下:
①。显示intent
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
在代码可以直接看到上下两个活动,=。
②。隐式intent
Intent intent2 = new Intent("com.example.intenttest.ACTION_START");
intent2.addCategory("com.example.intenttest.MY_CATEGORY");
startActivity(intent);
隐式intent通过action,category,和data来进行匹配,匹配大致如下
<activity
android:name=".SecondActivity"
android:label="@string/app_name">
<intent-filter >
<action android:name="com.example.intenttest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.example.intenttest.MY_CATEGORY"/>
</intent-filter>
</activity>
如果少了android.intent.category.ACTION_START则会发生会找到相匹配的intent的错误。
2)startActivityForResult()的用法。
如果一个Activity在运行之后想要返回数据给上一个启动它的Activity,那么可以使用startActivityForResult()方法。
该方法的使用步骤例子如下;
1)在MainActivity里面启动SecondActivity,传入请求码,也就是requestCode:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
2)在SecondActivity里面新建一个intent对象,封装好想要传递的数据之后,然后用putExtra方法传递相关的数据:
Intent intent = new Intent();
intent.putExtra("extra_data", "我返回数据了");
setResult(RESULT_OK, intent);
finish();
3)在最后MainActivity里面得到返回的数据:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if(RESULT_OK == resultCode){
String extra_data = data.getStringExtra("extra_data");
Log.i("extra_data",extra_data);
}
break;
default:
break;
}
};
其中onActivityResult为回调函数,三个参数分别为请求码,回执码,还有传送的数据。
4)安卓活动的声明周期:
相信很多读者都知道安卓的生命周期包括七个函数,其中onCreate与onDestroy对应,它们所对应的生命周期的完整的生命周期;onStart与onStop对应,它们所对应的生命周期是可见的生命周期;onResume与onPause对应,它们所对应的生命周期是前台生命周期;
这里我们来说说onPause与onStop的区别。onPause在活动被切换到后台时发生,例如出现一个Dialog。而onStop是一个活动完全给另外一个活动覆盖的时候调用。我们可以在onPause方法保存程序的关键数据。代码大致如下:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
Log.i("Life Tag", "OnCreate");
Button normalButton = (Button)findViewById(R.id.normal_button);
Button dialogButton = (Button)findViewById(R.id.dialog_button);
EditText tempText = (EditText)findViewById(R.id.login_name);
if(null != savedInstanceState){//利用Bundle对象来还原之前在内存回收活动时,保存的关键数据
String tempData = savedInstanceState.getString("tempName");
Log.i("Tag", tempData);
tempText.setText(tempData);
}
//测试安卓活动的七个生命周期,利用对话框活动和完全覆盖活动来区别onPause和onStop方法
normalButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(MainActivity.this,NormalActivity.class);
startActivity(intent);
}
});
dialogButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(MainActivity.this,DialogActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Log.i("Life Tag", "onStart");
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.i("Life Tag", "OnResume");
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Log.i("Life Tag", "OnPause");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Log.i("Life Tag", "onStop");
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i("Life Tag", "onDestroy");
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Log.i("Life Tag", "OnRestart");
}
//在内存不足时回收活动,保存其主要关键数据,这在用户体验还是比较重要的了。
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
EditText tempText = (EditText)findViewById(R.id.login_name);
String name = tempText.getText().toString();
outState.putString("tempName", name);
Log.i("Name_Tag", name);
}
5)活动的四个启动模式:
安卓活动启动模式共有四个:standard(默认的启动模式),singalTop,singalTask,singalInstance
在说启动模式之前我们先来说一个概念:返回栈
返回栈是一种栈的数据结构,也即符合FILO的原则。所有Activity的集合存放在这个栈中,新覆盖的活动会在栈顶的位置,也就是说栈顶的活动时可见的。
standard(默认启动模式)
返回栈存放许多活动,但是使用standard方式启动之后,系统不会在乎返回栈中是否存在一个同样的活动,只要启动它,就会重新创建一个活动的实例。
singalTop启动模式:
当返回栈栈顶已经存在存在一个活动的时候,例如是FirstActivity,如果这个时候时候再启动FirstActivity的时候,因为这个活动已经存在栈顶,所以不会在创建一个FirstActivity活动的实例。
singalTask启动模式:
其实仔细想想,上面singalTop模式还是有许多不不足的地方,例如,新启动一个名为SecondActivity的活动,而返回栈其实早就有这个活动,那么,直接运用返回栈的这个SecondActivity的活动,不用新创建一个活动。你猜对了,singalTask模式就是这么一种启动启动模式。
singalInstance启动模式:
singgalInstance算是这几种模式最复杂的一种启动模式了。singalInstance模式提出是为了解决共享活动实例的问题。那么什么是共享活动实例呢?共享活动也就是说你的应用程序里面的某个(也能是几个)活动是允许其他应用程序调用的(最经常看见的应该是支护宝客户端吧。)那么singalInstance将会很好的解决的这个问题。这个模式我们用代码来试验一下:
①MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button secondButton = (Button)findViewById(R.id.secondButton);
Log.i("TAG", "The task is"+getTaskId());
secondButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
②SecondActivity
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_second);
Log.i("TAG", "The task is"+getTaskId());
Button thirdButton = (Button)findViewById(R.id.third_button);
thirdButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
startActivity(intent);
}
});
}
}
③ThirdActivity
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_third);
Log.i("TAG", "The task is"+getTaskId());
Button firstButton = (Button)findViewById(R.id.firstButton);
firstButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(ThirdActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
}
打印的信息如下: