Android:活动笔记

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)
  而如果你不加@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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值