1.@Override:
@Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处:
1、可以当注释用,方便阅读
2、编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错比如你如果没写@Override而你下面的方法名又写错了,这时你的编译器是可以通过的(它以为这个方法是你的子类中自己增加的方法)
example:
在重写父类的onCreate时,在方法前面加上@Override系统可以帮你检查方法的正确性。例如:
public void onCreate(BundlesavedInstanceState){…….}
这种写法是正确的,如果你写成
public void oncreate(BundlesavedInstanceState){…….}
这样编译器会报如下错误——
The method oncreate(Bundle) of type HelloWorld must override or implement a super type method,
以确保你正确重写onCreate方法。(因为oncreate应该为onCreate)
这种写法是正确的,如果你写成
public void oncreate(BundlesavedInstanceState){…….}
这样编译器会报如下错误——
The method oncreate(Bundle) of type HelloWorld must override or implement a super type method,
以确保你正确重写onCreate方法。(因为oncreate应该为onCreate)
而如果你不加@Override,则编译器将不会检测出错误,而是会认为你新定义了一个方法oncreate。
2.XML中定义id和引用id。
如果需要的layout的XML中定义id的话,需要加上“+”,例如:android:id="@+id/button_1";
如果是引用一个id的话,例如:android:id="@id/id_name"; 不需要加上“+”
3.setContentView。
setContentView() 给当前的活动加载一个布局。例如:setContentView(R.layout.first_layout); 传入布局的id,此时在gen目录下回产生对应的id,
如果不调用该方法,这个布局不会被加载到活动中,也就是说 不会产生这个界面。
4.AndroidManifest注册。
注册活动是在<activity> 中进行的,需要在AndroidMadnifest下编写对应的代码。
<activity
android:name=".FirstActivity"
android:label="This is FirstActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
name:需要指定具体注册哪一个活动,前面的“.”,代表着当前包名的缩写,在最外层的<manifest>中的package已经指定了程序的包名,此时可以直接用“.”来代表当前的包名,“.”后直接加上对应的活动名字就好。
label:标题栏的内容,即app最上面的名称。
intent-filter:中间的两行代码,代表着指明这个程序是最先启动的活动。
5.requestWindowFeature。
requestWindowFeature(Window.FEATURE_NO_TITLE); 可以隐藏app中的标题。
6.Toast。
相当于一个提示语句。
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
}
});
1.findViewById 参数是一个View的ID(就是在layout XML中定义的ID), 返回一个View对象,(Button)向下转型为Button类型。
2.setOnClickListener() 这里传入了一个OnClicklistener 类,并且重写了onClick函数(匿名类的书写方法)。
3.makeText 三个参数,第一个参数是Context,第二个是Toast显示内容,第三个是Toast显示的时长。
4.onClickListener() 需要import android.view.View.onClickListener; 模块。
7.Menu。
一.main.XML 中定义menu名字和title。
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
二.创建一个menu
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
1.getMenuInflater() 得到一个MenuInflater对象,调用它的inflate函数来创建菜单,接收两个参数,第一个参数指定我们通过哪一个资源文件来创建菜单。第二个指定我们的菜单选项将添加到哪一个Menu对象中,这里直接传入到menu中。
2.这个方法必须返回true,如果返回false则无法创建菜单。
三.对每个menu选项添加事件。
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.add_item:
Toast.makeText(this, "you Click Add", Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this, "You Click Remove", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
1.使用onOptionsItemSelected() 对每个menu添加事件,传入的参数为MenuItem 类型,使用此类型的getItemId得到 对应的id,然后设置响应的内容。
四.销毁活动。
在onClick里面使用finish() 函数即可。
8.Intent.
Intent 用来在跳转到另一个活动中。
Intent显示:
setOnClickListener
Intent intent = new Intent(FirstActivity.this,SecondeActivity.class);
startActivity(intent);
新创建一个Intent类型的引用,Intent的第一个参数为:启动活动上下文,第二个参数是想要启动的目标活动。
startActivity(intent):用来执行这个intent。
Intent隐式:
AndroidManifest.XML
<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>
setOnClickListener
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
隐式的Intent首先需要在注册文件中配置信息。添加<intent-filter> 配置其中的<action> 设置一个name,然后在配置<category>name的值可以是DEFAULT也可以是自定义的。
然后在监听事件的代码中,新建Intent引用传入<action>中name的值,代表想要相应这个活动,因为category是默认的category,所以在调用startActivity时自动将这个category添加到Intent中了。
如果想要新建一个category:
intent。addCategory("com.example.activitytest.MY_CATEGORY");
那么需要在<intent-filter>中声明这个category:
<category android:name="com.example.activitytest.MY_CATEGORY" />
必须<action>和<category>中的内容能够同时匹配Intent中指定的action和category,这个活动才能响应Intent。
更多的Intent隐式用法。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
这里的action是Android系统内置的动作。
setData需要一个类型为Uri对象,一般使用Ur.parse 将字符串解析成Uri对象,然后传入。
如果将<intent-filter>中的action那么配置为:android.intent.action.VIEW,那么这个活动也能与Intent中的Intent.ACTION_VIEW所匹配。
这里会调用系统拨号,并传入对应的默认号码:
Intent intent = new Intent(Intent.ACTION_DTAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
9.活动件的数据传递。
1.向下一个活动传递数据:
String data = "Hello World!~";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
先构建一个String类型的数据,然后使用显式Intent。
调用intent的putExtra函数,传入两个参数(key,value),在这里key是extra_data,value是data。
然后调用startAcvitity函数。 数据保存到intent中,传入到下一个活动中去。
在另一个活动中得到数据。
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
使用getIntent函数得到用于启动这个活动的Intent,然后调用getStringExtra方法,传入想要得到的键值。getIntExtra、getBooleanExtra,分别得到不同的数据类型。
2.如果想从下一个活动中得到数据:
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
startActivityForResult方法启动活动,传入intent和一个唯一的请求码。
另一个活动中返回数据:
Intent intent = new Intent();
intent.putExtra("data_return","Hello");
setResult(RESULT_OK,intent);
finish();
使用setResult方法接收两个参数,第一个参数是活动返回的处理结果:一般只用RESULT_OK和RESULT_CANLELED,第二个参数是带有数据的intent。
上一个活动得到数据需要重写onActivityResult方法:
protected void onActivityResult(int requestCode,int resultCode,Intent data) {
switch(requestCode) {
case 1:
if(resultCode == RESULT_OK) {
String returnData = data.getStringExtra("data_return");
Toast.makeText(this, returnData, Toast.LENGTH_SHORT).show();
}
break;
}
onActivityResult方法有三个参数:第一个参数是启动活动传入的请求码,第二个参数是处理结果,第三个是携带数据的Intent。
如果需要按下Back键也可以得到信息,需要重写onBackPressed()
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello");
setResult(RESULT_OK,intent);
finish();
}
使用方法如上。
10.活动的生命周期。
1.活动是以栈的形式存放的。
2.活动的生命周期最多有四中状态。
1.运行状态。
2.暂停状态。
3.停止状态。
3.销毁状态。
3.活动的生存期。
1.onCreate():每次活动被创建的时候调用。
2.onStart():每次活动由不可见变为可见时调用。
3.onResume():当活动准备好与用户进行交互的时候调用。
4.onPause():在系统准备去启动或者恢复另一个活动时调用。
5.onStop():在活动变为完全不可见的时候调用。
6.onDestroy():在活动被销毁之前调用。
7.onRestart():活动由停止状态变为运行状态时调用。
例:
活动A(全屏),活动B(全屏),活动C(对话框)。以活动A为主活动,可启动活动B和活动C。
当最开始进入时,启动活动A,此时分别依次调用:onCreate、onStart、onResume。
当活动A启动活动B时,由于活动B为全屏需要将活动A覆盖,所以此时活动A由可见变为完全不可见,所以活动A依次调用的函数为:onPause、onStop。
由活动B退回到活动A,此时活动A因为已经停止了,所以需要重新启动,此时活动A调用的函数依次为:onRestart、onStart、onResume。
由活动A启动活动C时,由于活动C为对话框形式的,所以不会将活动A完全覆盖,所以此时活动A处于暂停状态,调用的函数为:onPause。
由活动C退回到活动A,此时活动A不需要重新启动,所以不需要调用onRestart函数,所以活动A此时调用函数:onResume。
当活动A退出时,活动A销毁,此时依次调用:onPause、onStop、onDestroy。
(当中途活动A最小化时,也只是调用onPause、onStop,对应的再次进入活动A时,调用onStart、onStart、onResume。但是当内存不足时,处于暂停状态的活动可能被系统销毁掉。)
11.onSaveInstanceState。
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something";
outState.putString("data_key","tempData");
}
该函数用来当活动被销毁时,保存数据用的,将数据保存到Bundle对象中,使用putString(或者putInt),传入key和value。
可以在onCreate中取得该数据:
if(savedInstanceState != null) {
String tempData = savedInstanceState.getString("data_key");
}
调用Bundle对象的getString方法,传入key即可。
12.活动的四种启动模式。
1.standard。
系统默认的启动默认,每当启动活动时,系统不管这个活动在返回栈中是否存在,都会创建一个新的实例,然后入栈。
2.singleTop。
这种模式下,当启动活动为返回栈的栈顶的时候,系统可以直接使用它,而不会创建一个新的实例,但是当这个活动不在栈顶时,还是会创建该实例。
3.singleTask。
这种模式下,当返回栈中存在该活动时,无论该活动实例存在返回栈中的哪个地方,启动该活动直接使用该活动的实例,系统不会创建新的实例,但是处于该活动实例上面的所有活动均出栈。
4.singleInstance。
这种模式下,当启动该活动时,会为该活动创建一个新的独立的返回栈并且入栈。
13.如何直接退出程序。
编写BaseActivity.java
package com.example.activitytest;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.removeActivity(this);
}
}
getClass.getSimpleName:可以打印出此时的活动名字。可以用来查看此时哪一个活动被创建。(前提是其他活动继承该类)
编写ActivityCollector.java
package com.example.activitytest;
import java.util.*;
import android.app.Activity;
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();
}
}
}
}
该类中的都是static.
让其他的活动继承BaseActivity.
然后再想要直接退出程序的地方调用finishAll即可。
ActivityCollector.finishAll();