Android第一行代码-探究活动

作者 汪小祯 日期 2016-07-30
Android第一行代码-探究活动

活动初始化

新建一个项目,首先要输入的代码便是

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

自己去网上搜索了下这行代码,网上给出的解释如下

每个activity都要进行一些必要的初始化,而这些初始化就是通过调用父类的构造函数来进行的,举个例子,生成一个空白的activity,起码有一个标题,这个标题是怎样关联和生成的,就是通过构造函数来处理的啦。
事实上,如果没有这行代码,程序启动时会发生崩溃。

活动中加载布局

.class文件里面会写程序的代码,而.xml界面文件里面则会保存APP的外观,在我个人看来,就像肉与灵魂的关系,.xml文件里修改外表,而.class文件里面决定每一个部件会发生什么行为
加载布局
在Oncrete函数中写

setContentView(R.layout.first_layout);

在AndroidManifest文件中注册

完成了.class文件和.xml文件的关联后,我们还需要在AndroidMainfest.xml文件中进行注册

<activity
android:name="com.example.activitylifecycletest.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

每一个Android项目都会包含一个AndroidManifest.xml文件,这个文件包含了APK所需的系统权限等。
开发文档:The manifest tag is the root of an AndroidManifest.xml file, describing the contents of an Android package (.apk) file. One attribute must always be supplied: package gives a unique name for the package, using a Java-style naming convention to avoid name collisions. For example, applications published by Google could have names of the form com.google.app.appname
Inside of the manifest tag, may appear the following tags in any order: permission, permission-group, permission-tree, uses-sdk, uses-permission, uses-configuration, application, instrumentation, uses-feature.

隐藏标题栏

有的时候我们往往需要将标题栏隐藏,可以在Oncreate函数中加入以下代码

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.first_layout);
}

特别注意代码需要在setContentView(R.layout.first_layout);之前加

使用Toast

Toash是一种很好的提醒方式,一般小的信息我们都会用Toast进行提示

Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();

使用Menu

新建一个menu文件

res文件夹中New-Folder新建一个文件夹menu,然后在这个文件夹中新建一个名叫main的菜单文件,New-Android XML File,在新建的文件中输入以下代码

<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>

调用menu菜单

然后回到.class文件中,重写onCreateOptionMenu()方法,代码如下:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

通过getMenuInflater()方法得到MenuInflater对象,再调用它的inflate()方法就可以给当前活动创建菜单,两个参数,第一个为我们的菜单,第二个为添加到哪一个Menu对象,使用onCreateOptionsMenu()方法传入的menu参数,然后返回true,如果返回false则无法显示。

添加菜单响应事件

在.class文件中,重写onOptionsItemSelected()方法:

@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;
}

销毁活动

效果类似于按一下Back键

finish();

打开新窗口

使用显示Intent

在AndroidMainfest.xml中

为SecondActivity注册

<activity
android:name=".SecondActivity"
</activity>

在.class文件中

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);

FirstActivity.this是当前类,SecondActivity.class是要打开的类。

使用隐式Intent

在AndroidMainfest.xml中

注册

<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

在.class文件中

Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);

隐式Intent打开网站

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Url.parse("https://www.baidu.com"));
startActivity(intent);

隐式Intent拨打电话

Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Url.parse("tel:10086"));
startActivity(intent);

向下一个活动传递数据

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("param1", "data1");
intent.putExtra("param2", "data2"); startActivity(intent);

putExtra方法中第一个参数是键,用于后面从Intent中取值,第二个参数才是真正传递的数据。

从下个活动中取出传递的数据

Intent intent = getIntent();
String data = intent.getStringExtra("param1");
Log.d("SecondActivity",data);

传递的Int数据则用getIntExtra()方法,布尔型数据则用getBooleanExtra()方法.

返回数据给上一个活动

在第一个.class中

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent,1);

第二个参数是请求值,这里设为1,只要是唯一值就好了

在第二个.class中

Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK,intent);
finish();

setResult()方法中有两个值,第一个参数一般只用RESULT_OK,第二个参数是返回的值

在第一个.class中重写onActivtyResult()方法来得到返回的数据

@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:
}
}

为了确保用户在按Back键回到上一个界面时也会返回数据应该在onBackPressed()方法中也添加倒数的二个模块中的代码

活动状态

每个活动在生命周期中最多四个状态

1.运行状态

当一个活动在返回栈栈顶时,则处于运动状态。

2.暂停状态

不处于栈顶,但仍可见。比如对话框

3.停止状态

当一个活动不再栈顶,并且不可见,则停止。如果其他地方需要内存,则有可能被系统回收。

4.销毁状态

当一个活动从返回栈移除后,则变成销毁状态。系统最倾向回收这个状态的活动,以保证手机内存充足。

活动的生存期

QQ20160801

onCreate()

在活动的第一次被创建,在这个方法中完成活动的初始化,比如加载布局,绑定事件。

onStart()

活动由不可见变成可见时调用

onResumen()

onPause()

onStop()

onDestroy()

销毁之前调用,之后活动的状态将变成销毁状态

onRestart()

三种生存期

完整生存期

在onCreate()方法和onDestroy()方法之间所经历的

可见生存期

在onStart()方法和onStop()方法之间经历的

前台生存期

活动在onResume()方法和onPause()方法之间经历的

保存临时数据

当活动处于停止状态时,是有可能被系统回收的,那么为了保存临时的数据,Activity提供了一个onSaceInstanceState()方法解决活动呗回收时临时数据得不到保存的问题。

重写onSaveInstanceState()方法

这个方法将在停止的活动被系统销毁前调用

@Override
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putString("data_key","传值");
}

修改onCreate()方法

可以看到onCreate方法中有个Bundle类型的参数,在平时这个参数会为null,但是当活动在被系统回收前有通过onSaveInstanceState()方法保存参数的话,这个参数会带有之前保存的全部数据。

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.normal_layout)
if(savedInstanceState!=null){
String tempData=savedInstanceState.getString("data_key");
} }

活动的四种启动模式

standard

默认启动模式,在不进行指定的情况下,所有活动都会自动以这种模式。
每启动一个新的活动,就会在返回栈中入栈,并位于栈顶位置。

对于使用standard模式的活动,系统不会在乎是否已经在返回栈中存在,每次启动都会创建一个新的实例

singleTop

当返回栈栈顶已经为该活动时,不会再新建一个实例
使用方法,在AndroidMain.xml中的启动模式中设置。

android:launchMode="singleTop"

singleTask

当返回栈中已经存在该活动时,不再新建一个实例,而是将活动之上的所有活动统统出栈。

android:launchMode="singleTask"

singleInstance

启动一个新的返回栈来管理活动

android:launchMode="singleInstance"

源码地址

https://github.com/isnine/AndroidWork/tree/master/Android第一行代码源码/第2章/ActivityTest