1.活动(Activity)是一种可以包含用户界面的组件,主要用于和用户进行交互。
2.每个Activity都应重写Activity的onCreate方法。
3.每个活动都需要在AndroidManifest.xml中的<applicatioon>标签下进行注册才可使用,主活动注册代码如下:
<activity
android:name = ".FirstActivity"
android:launchMode="singleTop"
android:label = "This is a FirstActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<intent-filter>声明表示FirstActivity是主活动。
4.活动界面隐藏标题栏:
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.d("FirstActivity", this.toString());
//隐藏标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
//加载布局,即界面,这个方法一般会传入一个布局的id
setContentView(R.layout.first_layout);
}
注意:requestWindowFeature(Window.FEATURE_NO_TITLE);一定要在 setContentView(R.layout.first_layout); 前执行。
5 .在活动中使用Toast
Toast.makeText(FirstActivity.this, "You clicked Button1", Toast.LENGTH_SHORT).show();
这三个参数分别是:context对象,即Toast要求的上下文(活动本身就是一个Context对象);
“ ”,Toast显示的文本内容;
Toast显示的时长。
6.使用显式Intent启动活动
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
在FirstA ctivity中启动SecondActivity活动。
7.使用隐式Intent启动活动
(1)首先,配置被启动活动的<intent-filter>标签下内容,指定当前活动能够响应的action和category:
<activity
android:name = ".SecondActivity">
<intent-filter>
<action android:name = "com.example.activitytest.ACTION_START" />
<category android:name = "android.intent.category.DEFAULT" />
//<category android:name = "com.example.activitytest.MY_CATEGORY"/>
</intent-filter>
</activity>
只有<action>和<category>中的内容能够同时匹配上Intent中指定的action和category时,这个活动才能响应该Intent。
(2)然后,编写与其对应的Intent
Intent intent = new Intent("com.example.activitytest.ACTION_START");
//intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent);
蓝色的两句必须同时使用系统才不会崩溃。
8.使用隐式Intent启动其他程序的活动
(1)打开百度浏览器
//隐式实现多个应用程序共享
Intent intent = new Intent(Intent.ACTION_VIEW);
//指定Intent操作baidu
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
(2)调用系统拨号界面
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
9.使用Intent在启动活动时传递数据
发送数据(FirstActivity)
public void onClick(View v)
{
//显式Intent
String data = "Hello SecondActivity!";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
}
接收数据(SecondActivity)
public class SecondActivity extends BaseActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.d("SecondActivity", this.toString());
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.second_layout);
Intent intent = getIntent(); //找到用于启动SendActivity的Intent
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);
}
}
10.通过Intent返回数据给上一个活动
(1)FirstActivity
请求码是1,意味着firstActivity一旦开启SecondActivity活动,SecondActivity会得到一个1,即1就表示SecondActivity
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
// TODO Auto-generated method stub
switch(requestCode)
{
case 1:
if(resultCode == RESULT_OK)
{
String returnedData = data.getStringExtra("data_return");
Log.d("FirstActivity", returnedData);
}
break;
default:
}
}
(2)SecondActivity
Intent intent = new Intent();
intent.putExtra("data_return", "Hello firstActivity!");
setResult(RESULT_OK, intent);
finish();
setResult接收两个参数,第一个参数用于向上一个活动返回处理结果,第二个参数则是把带有数据的Intent传递回去。
finish用于销毁当前活动,然后会马上自行调用firstActivity中的onActivityResult方法进行处理。
11.活动的生命周期
Android是使用任务来管理活动的,任务是一个存放在栈里的活动的集合,符合后进先出的数据结构,即新的活动总是在栈顶,调用时也是新的活动先出。
当MainActivity第一次被创建时,会依次执行onCreate()、onStart()、onResume()。
然后启动NormalActivity,将完全遮挡MainActivity,此时,执行onPause()和onStop()。
接着按下返回键返回MainActivity,执行onRestart()、onStart()和onResume()。
启动DialogActivity,未完全遮挡MainActivity,故执行onPause()。
最后按下返回键返回MainActivity,执行onResume()。
12.解决活动被回收时临时数据得不到保存的问题
(1)当一个活动被回收时,通过下面的操作将数据保存下来
//保证活动在被回收之前被调用,将数据tempData保存到data_key中
@Override
protected void onSaveInstanceState(Bundle outState)
{
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key", tempData);
}
(2)当活动再次开启时,调用onCreate将数据读取回来
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
if(savedInstanceState != null )
{
String tempData = savedInstanceState.getString("data_key");
Log.d(TAG, tempData);
}
}
13.活动的启动模式
(1)standard
活动默认的启动模式,对于使用Standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新实例。
(2)singleTop
当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。但是,当活动并未处于栈顶位置时,这时再启动活动,还是回创建新的实例。
(3)singleTask
每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
(4)singleInstance
启用一个新的返回栈来管理这个活动
14.根据程序当前的界面判断出是哪个活动
public class BaseActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
}
public class FirstActivity extends BaseActivity //继承自BaseActivity
15.随时随地退出程序
public class ActivityCollector
{
public static List<Activity> activities = new ArrayList<Activity>();
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();
}
}
}
}
public class BaseActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy()
{
// TODO Auto-generated method stub
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
16.启动活动的最佳写法
FirstActivity中,开启SecondActivity:
SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
SecondActivity中:
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);
}