1、AndroidManifest.xml
<
application
android
:allowBackup=
"true"
android
:icon=
"@mipmap/ic_launcher"
android
:label=
"@string/app_name"
android
:supportsRtl=
"true"
android
:theme=
"@style/AppTheme"
>
<
activity
android
:name=
".HelloWorldActivity"
>
<
intent-filter
>
<!--下面两行表示是 主活动-->
<
action
android
:name=
"android.intent.action.MAIN"
/>
<
category
android
:name=
"android.intent.category.LAUNCHER"
/>
</
intent-filter
>
</
activity
>
</
application
>
2、toast
Button
button1 = (
Button
) findViewById(R.id.
button_1
);
button1.setOnClickListener(
new
View.OnClickListener() {
// 为button1 注册一个监听器
@Override
public void
onClick(View v) {
//当button1 被点击时,添加回调方法
//参数1是上下文, 参数2是toast显示的文本, 第三个是时长(Toast.LENGTH_SHORT, Toast.LENGTH_LONG)
Toast.
makeText
(FirstActivity.
this
,
"you clicked the button1"
, Toast.
LENGTH_LONG
).show();
}
});
3、右上角的菜单项:
(1)写一个菜单项的布局:
<?
xml version=
"1.0"
encoding=
"utf-8"
?>
<
menu
xmlns:
android
=
"http://schemas.android.com/apk/res/android"
>
<
item
android
:id=
"@+id/add_item"
android
:title=
"Add"
/>
<
item
android
:id=
"@+id/remove_item"
android
:title=
"Remove"
/>
</
menu
>
(2)在当前活动中注册右上角菜单项
// 返回true, 那么可以在当前活动中显示菜单项
@Override
public boolean
onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.
main
, menu);
return true
;
}
4、监听菜单项点击事件
//这里是给 菜单项 添加监听事件
@Override
public boolean
onOptionsItemSelected(MenuItem item) {
switch
(item.getItemId()) {
case
R.id.
add_item
:
Toast.
makeText
(
this
,
"You clicked Add"
, Toast.
LENGTH_SHORT
).show();
break
;
case
R.id.
remove_item
:
Toast.
makeText
(
this
,
"You clicked Remove"
, Toast.
LENGTH_SHORT
).show();
break
;
default
:
}
return true
;
}
5、销毁活动
直接调用活动的全局函数:finish();就行了形如:
6、活动中穿梭以及调用其他软件的activity
(1)显式 intent
// 第一个参数是当前的应用上下文,第二个参数是需要打开的那个activity的class
Intent intent =
new
Intent(FirstActivity.
this
, SecondActivity.
class
);
startActivity(intent);
(2)隐式intent
在minifast.xml中注册activity的时候用了<action>和<category>这两个标签。那么当一个intent中的action和category完全匹配上,才能调用隐式的活动
<
activity
android
:name=
".SecondActivity"
android
:launchMode=
"singleInstance"
>
<
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
>
Intent intent =
new
Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
(第二个category参数没有填写,是因为android.intent.DEFAULT是一种默认的category,在调用startAction()的时候会自动将这个category添加到Intent中)
如果要加category,那么在中间插一句:
intent.addCategory("com.example.activitytest.MY_CATEGORY")
然后再startActivity(intent);就可以了
(3)更多隐式intent:
不仅仅可以启动自己程序里面的活动,其实还可以启动其他程序的活动
——调用浏览器:
button1.setOnClickListener(
new
View.OnClickListener() {
// 为button1 注册一个监听器
@Override
public void
onClick(View v) {
//当button1 被点击时,添加回调方法
Intent intent =
new
Intent(Intent.
ACTION_VIEW
);
//这里冒号之前的http指的是http协议,对应于scheme中的协议头
intent.setData(Uri.
parse
(
"http://www.baidu.com"
));
startActivity(intent);
}
}
——调用电话:
button1.setOnClickListener(
new
View.OnClickListener() {
// 为button1 注册一个监听器
@Override
public void
onClick(View v) {
//当button1 被点击时,添加回调方法
Intent intent =
new
Intent(Intent.
ACTION_VIEW
);
//这里冒号之前的http指的是telp协议,对应于scheme中的协议头
intent.setData(Uri.
parse
(
"tel:10086"
));
startActivity(intent);
}
}
7、活动中传递数据:
button1
.setOnClickListener(
new
View.OnClickListener() {
// 为button1 注册一个监听器
@Override
public void
onClick(View v) {
//当button1 被点击时,添加回调方法
String data =
"hello yaoyao"
;
Intent intent =
new
Intent(FirstActivity.
this
, SecondActivity.
class
);
intent.putExtra(
"extra"
, data);
startActivity(intent);
}
});
数据接收方
Intent intent = getIntent();
String data = intent.getStringExtra(
"extra"
);
Log.
d
(
"second onCreate"
, data);
8、返回数据给上一个活动
第一个活动
button1
.setOnClickListener(
new
View.OnClickListener() {
// 为button1 注册一个监听器
@Override
public void
onClick(View v) {
//当button1 被点击时,添加回调方法
String data =
"hello yaoyao"
;
Intent intent =
new
Intent(FirstActivity.
this
, SecondActivity.
class
);
//第二个参数是请求码,只要是唯一参数就可以
startActivityForResult(intent,
1
);
}
});
第二个活动:
button2
.setOnClickListener(
new
View.OnClickListener() {
@Override
public void
onClick(View v) {
Intent intent =
new
Intent();
//这里的intent初始化的时候并没有指定class,只是用来传递数据
intent.putExtra(
"data_return:"
,
"hello my yaoyao"
);
//这里的setResult, 第一个参数:向上一个活动返回吃力结果,一般为RESULT_OK,或RESULT_CANCELED
//第二个参数就是把带有数据的Intent传递回去
setResult(
RESULT_OK
, intent);
finish();
}
});
第一个活动接受第二个活动的参数:
@Override
//第一个参数是启动第二个活动时传入的请求码,第二个参数是上个页面的处理结果,第三个就是数据
protected void
onActivityResult(
int
requestCode,
int
resultCode, Intent data) {
switch
(requestCode) {
case
1
:
if
(resultCode ==
RESULT_OK
) {
String returnedData = data.getStringExtra(
"data_return"
);
Log.
d
(
"FirstActivity"
, returnedData);
}
break
;
default
:
}
}
如果用户点击返回键回到上个界面:
那么重写返回键的相应方法就可以了:
public void onBackPressed() {
@Override
public void
onClick(View v) {
Intent intent =
new
Intent();
//这里的intent初始化的时候并没有指定class,只是用来传递数据
intent.putExtra(
"data_return:"
,
"hello my yaoyao"
);
//这里的setResult, 第一个参数:向上一个活动返回吃力结果,一般为RESULT_OK,或RESULT_CANCELED
//第二个参数就是把带有数据的Intent传递回去
setResult(
RESULT_OK
, intent);
finish();
}
});
9、活动的生命周期
运行状态,暂停状态,停止状态,销毁状态
完整生存期:onCreate() 到 onDestroy()
onCreate():活动第一次被创建的时候调用
一个活动会在onCreate 完成各种初始化操作,在onDestroy中释放内存
可见生存期:onStart() 到 onStop()
onStart() 活动由不可见变为可见的时候调用
onStop() 活动完全不可见的时候调用(非dialog)
前台生存期:onResume() 到 onPause()
onResume(): 活动准备好和用户交互的时候调用
onPause(): 这个方法在系统准备去启动或者恢复另一个活动的时候调用
通常用来释放一些消耗cpu的资源和保存数据。
onRestart() 从停止状态变为运行状态之前调用。
10、在活动被销毁之前一定会保存数据:
onSaveInstanceState()会携带一个Bundle类型的参数,
Bundle提供了一些列方法来保存数据:putString(),putInt();
保存本页面数据:
@Override
//这个方法是在这个活动被系统回收之前,保存页面中的数据;
//恢复数据在onCreate()方法中
protected void
onSaveInstanceState(Bundle outState){
super
.onSaveInstanceState(outState);
String tempData =
"hello my love"
;
outState.putString(
"data_key"
, tempData);
}
恢复本页面数据就是用这个方法:
protected void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
Log.
d
(
"FirstActivity"
,
"Task id is "
+ getTaskId());
setContentView(R.layout.
first_layout
);
if
(savedInstanceState !=
null
){
String tempData = savedInstanceState.getString(
"data_key"
);
Log.
d
(
TAG
, tempData);
}
}
11、活动的启动模式
在androidManifast.xml中的<activity>中指定android:launchMode属性来选择启动模式
(1)standard(默认模式)
他不会在乎你想启动的活动是不是已经在栈顶了,反正会创建个新的
(2)singleTop
<activity:launchMode="singleTop">
如果要创建的活动已经在栈顶了就不会创建,如果不再栈顶,就会创建新的
(3)singleTask
<activity:launchMode="singleTask">
如果要创建的活动在栈中已经存在,那么,会把它上面的多有活动都干掉
(4)singleInstance
打开使用这个就是把活动放在一个单独的栈里面,
当点击返回的时候,返回的都是自己程序活动栈里面的活动,
当当前活动出栈结束,才会显示singleInstance里面的活动
ps:活动当前活动所在栈的id,直接使用全局方法:getTaskId()
12、小技巧:为所有活动添加一个父类
。
这样的话类似于python的修饰器,
可以做一些全局操作,例如知道自己在什么活动中:
@Override
protected void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
Log.
d
(
"BaseActivity"
, getClass().getSimpleName());
ActivityCollector.
addActivity
(
this
);
}
13、随时随地退出程序
用一个专门的集合类来管理所有的活动:
在任何地方调用
ActivityCollector.finishAll()
就可以杀掉所有的活动
import
android.app.Activity;
import
java.util.ArrayList;
import
java.util.List;
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();
}
}
}
}
然后在BaseActivity中,
public class
BaseActivity
extends
AppCompatActivity {
@Override
protected void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
Log.
d
(
"BaseActivity"
, getClass().getSimpleName());
ActivityCollector.
addActivity
(
this
);
}
@Override
protected void
onDestroy() {
super
.onDestroy();
ActivityCollector.
removeActivity
(
this
);
}
}
14、杀掉程序进程
只能杀死当前程序的进程,是不可以杀死别人的
android.os.Process.killProcess(android.os.Process.myPid())
15、启动活动的最佳写法
public static void
actionStart(Context context, String str){
Intent intent =
new
Intent(context, SecondActivity.
class
);
intent.putExtra(
"data"
, str);
context.startActivity(intent);
}
使用的时候,直接调用:
actionStart
(FirstActivity.
this
,
"guanjia"
);