Android中的Activity是一个应用组件, 相当于iOS中的UIViewController , 用户可与其提供的屏幕进行交互, 进行拍照,以及拨打电话, 发送电子邮件 或者查看点图等操作. 每个Activity都会获得一个用户绘制其用户界面的窗口. 窗口通常会充满整个屏幕 , 但也可小于屏幕并浮动在其他窗口之上.
※ 创建Activity需要注意在清单文件 mainifests中声明Activity.
一.
1. setContentView(); 函数是指定一个视图用来呈现内容. 绑定Java文件的.
2. mainifests -> AndroidMainifest.xml 是安卓程序的配置文件
3. java目录里放的是整个程序的源代码
4. res目录是所有的资源文件所存在的目录 例如 样式 视图xml
5. 绑定事件调用函数 findViewById(R.id.btnIdentifier).setOnClickListener(new View.OnClickListener() {
//Override
public void Onclick(View v) {
//响应事件
}
});
6. 跳转另一个Activity的方法是 startActivity(new Intent(MainActivity.this , AnOtherActivity.class ));
7. 跳转网页的方法 startActivity(new Intent(Intent.ACTION_VIEW , Uri.parse("http://www.baidu.com") ));
二.
Activity的生命周期
onCreate(); //表示Activity正在被创建 , 生命周期内只调用一次 , 相当于iOS中的viewDidLoad(). 安卓中一般用来进行绑定控件,设置对应的响应事件
onStart(); //Activity变为在屏幕上对用户可见时调用
onResume(); //开始与用户交互时调用, 可见
onPause(); //Activity正在停止. 可见 ,失去焦点
onStop(); //Activity即将停止,且处于不可见状态
onDestory(); //Activity正在被销毁 , 在整个Activity生命周期内只调用一次
onRestart(); //Activity正在重新启动
当在一个Activity上启动另外一个Activity的时候:
第一个Activity onPause() --> 第二个Activity onCreate() --> onStart() --> onResume() --> 第一个Activity onStop()
当在第二个Activity返回第一个Activity的时候:
第二个Activity onPause() --> 第一个Activity onRestart() --> onStart() --> onResume() --> 第二个Activity onStop() --> onDestory()
三.
在Activity之间传递参数
1.基本数据类型
//传入
findViewById(R.id.
btnStart
).setOnClickListener(
new
View.OnClickListener() {
@Override
public void
onClick(View v) {
Intent i =
new
Intent(MainActivity.
this
,TheAty.
class
);
i.putExtra(
"data"
,
"Hello jikexueyuan!"
);
startActivity(i);
}
});
//调用
Intent i = getIntent();
tv
= (TextView) findViewById(R.id.
tv
);
tv
.setText(i.getStringExtra(
"data"
));
2
.传递数据包
//传入
findViewById(R.id.
btnStart
).setOnClickListener(
new
View.OnClickListener() {
@Override
public void
onClick(View v) {
Intent i =
new
Intent(MainActivity.
this
,TheAty.
class
);
Bundle b =
new
Bundle();
b.putString(
"name"
,
"极客学院"
);
b.putInt(
"age"
,
2
);
// b.putBundle("bundleName",bundle);
i.putExtras(b);
startActivity(i);
}
});
//调用
Bundle data = i.getExtras();
tv
= (TextView) findViewById(R.id.
tv
);
tv
.setText(String.
format
(
"name=%s, age = %d, name1 = %s"
,data.getString(
"name"
),data.getInt(
"age"
),data.getString(
"name1"
,
"leo"
)));
3
.传递值对象
//自定义对象 Serializable Java
方式序列化
public class
User
implements
Serializable{
private
String
name
;
private int
age
;
public int
getAge() {
return
age
;
}
public
String getName() {
return
name
;
}
public void
setAge(
int
age) {
this
.
age
= age;
}
public void
setName(String name) {
this
.
name
= name;
}
public
User(String name,
int
age){
this
.
name
= name;
this
.
age
= age;
}
}
//
//传入
findViewById(R.id.
btnStart
).setOnClickListener(
new
View.OnClickListener() {
@Override
public void
onClick(View v) {
Intent i =
new
Intent(MainActivity.
this
,TheAty.
class
);
i.putExtra(
"user"
,
new
User(
"呵呵哒"
,
12
));
startActivity(i);
}
});
//调用
Intent i =
getIntent
();
User user = (User) i.getSerializableExtra(
"user"
);
tv
= (TextView) findViewById(R.id.
tv
);
tv
.setText(String.
format
(
"name=%s, age=%d"
,user.getName(),user.getAge()));
//反向传值
// A界面
findViewById(R.id.
btnStart
).setOnClickListener(
new
View.OnClickListener() {
@Override
public void
onClick(View v) {
Intent i =
new
Intent(MainActivity.
this
,TheAty.
class
);
startActivityForResult(i,
0
);
}
});
@Override //类似于代理方法
protected void
onActivityResult(
int
requestCode,
int
resultCode, Intent data) {
super
.onActivityResult(requestCode, resultCode, data);
textView
.setText(data.getStringExtra(
"data"
));
}
// B界面
editText
= (EditText) findViewById(R.id.
editText
);
button
= (Button) findViewById(R.id.
sendBackBtn
);
button
.setOnClickListener(
new
View.OnClickListener() {
@Override
public void
onClick(View v) {
Intent i =
new
Intent();
i.putExtra(
"data"
,
editText
.getText().toString());
setResult(
1
,i);
finish();
}
});
Android 中 Activity 启动模式
标准启动模式 standard
standard是系统默认的启动模式,每次激活Activity时都会创建Activity,并且放入任务栈中
<?
xml version=
"1.0"
encoding=
"utf-8"
?>
<manifest
xmlns:
android
=
"http://schemas.android.com/apk/res/android"
package=
"com.sahara.launchmode"
>
<application
android
:allowBackup=
"true"
android
:icon=
"@mipmap/ic_launcher"
android
:label=
"@string/app_name"
android
:roundIcon=
"@mipmap/ic_launcher_round"
android
:supportsRtl=
"true"
android
:theme=
"@style/AppTheme"
>
<activity
android
:name=
".MainActivity"
android
:launchMode=
"standard"
> //此处是设置启动模式的
<intent-filter>
<action
android
:name=
"android.intent.action.MAIN"
/>
<category
android
:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
</application>
</manifest>
SingleTop 模式
如果在任务的栈顶正好存在改Activity的实例,就重用该实例,而不会创建新的Activity对象,不过它会调用onNewIntent() 方法.
如果栈顶部不存在就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建新的实例). 会回调onNewIntent()方法
android
:launchMode=
"singleTop"
> //此处是设置启动模式的
SignleTask模式
如果在栈中已经有该Activity的实例,就重用该实例(会调用onNewIntent()方法)
重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈.
如果栈中不存在该实例,将会创建新的实例放入栈中.
SingleInstance 模式是一个独立的任务栈并且只放了一个实例Activity
显式Intent的使用
startActivity(
new
Intent(MainActivity.
this,
MyAty.
class
))
;
注册Activity
<activity
android
:name=".MyAty"
>
<intent-filter>
<category
android
:
name="android.intent.category.DEFAULT"
/>
默认DEFAULT一般就是Activity
<action
android
:
name="com.jikexueyuan.learnitent.action.MyAty"
/>
</intent-filter>
</activity>
定义常量
public static final
String
ACTION
= "com.jikexueyuan.learnitent.action.MyAty";
隐式Intent的使用 通过隐式可以跨应用启动其他程序的Activity
隐式
startActivity(
new
Intent(MyAty.
ACTION
));
禁止Activity跨模块(工程)导出
<activity
android
:name=".
MyAty
"
android
:exported="false"
/>
通过浏览器链接启动本地Activity
浏览器端核心代码
<a
href=
"app://hello"
>
Launch My App
</a>
安卓端核心代码配置 manifests/AndroidManifest.xml文件
<activity
android
:name=".LocalAppAty"
android
:label="LocalAppAty"
>
<intent-filter>
<category
android
:name="android.intent.category.BROWSABLE"
/>
<category
android
:name="android.intent.category.DEFAULT"
/>
<action
android
:name="android.intent.action.VIEW"
/>
<data
android
:scheme="app"
/>
</intent-filter>
</activity>
//获取并且打印Web端传来的完整字符串
Uri uri = getIntent().getData();
System.
out
.println(uri);