zoukankan      html  css  js  c++  java
  • Activity

    activity的生命周期

    这七个方法定义了Activity的完整生命周期。实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环:

    1.Activity的完整生命周期

      自第一次调用onCreate()开始,直到调用onDestory()为止。Activity在onCreate()中设置所有“全局”状态以完成初始化。

      而在onDestory()中释放所有系统资源。例如,如果Activity有一个线程在后台运行从网络下载数据,它会在onCreate()创建线程,

      而在onDestory()销毁线程

    2.Activity的完整可视周期

      自onStart()调用开始直到相应的onStop()调用结束。在此期间,用户可以在屏幕上看到Activity,尽管它也许并不是位于前台

      或者也不与用户进行交互。在这两个方法之间,我们可以保留用来向用户显示这个Activity所需的资源。例如,当用户不再看见 

      我们显示的内容时,我们可以在onStart()中注册一个BroadcastReceiver来监控会影响UI的变化,而在onStop()中来注销。onStart()

      和onStop()方法可以随着应用程序是否为用户可见而被多次调用。

    3.Activity的前台生命周期

      自onResume()调用起,至相应的onPause()调用为止。在此期间,Activity位于前台最上面并于用户进行交互。

      Activity会经常在暂停和恢复之间进行状态转换。例如当设备转入休眠状态或者有新的Activity启动时,将调用

      onPause()方法。当Activity获得结果或者接收到新的Intent时会调用onResume()方法。

    第一个Activity

    public class MainActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    System.out.println("onCreate().........");

    }

    @Override

    protected void onStart() {

    super.onStart();

    System.out.println("onStart().........");

    }

    @Override

    protected void onResume() {

    super.onResume();

    System.out.println("onResume().........");

    }

    @Override

    protected void onPause() {

    super.onPause();

    System.out.println("onPause().........");

    }

    @Override

    protected void onStop() {

    super.onStop();

    System.out.println("onStop().........");

    }

    @Override

    protected void onDestroy() {

    super.onDestroy();

    System.out.println("onDestroy().........");

    }

    @Override

    protected void onRestart() {

    super.onRestart();

    System.out.println("onRestart().........");

    }

    public void second(View view) {

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

    this.startActivity(intent);

    }

    public void third(View view) {

    Intent intent = new Intent(this, ThirdActivity.class);

    this.startActivity(intent);

    }

    }

    第二个Activity

    package com.itheima.lifecycle;

    import android.os.Bundle;

    import android.app.Activity;

    import android.view.Menu;

    public class SecondActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_second);

    }

    }

    3.第三个Activity

    package com.itheima.lifecycle;

    import android.os.Bundle;

    import android.app.Activity;

    import android.view.Menu;

    public class ThirdActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_third);

    }

    }

    4.清单文件

     <activity

                android:name="com.itheima.lifecycle.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>

            <activity android:name=".SecondActivity" >

            </activity>

            <activity

                android:name=".ThirdActivity"

                android:theme="@android:style/Theme.Dialog" >

            </activity>

    activity横竖屏切换的生命周期

    如果不配置如上代码,则在切换横竖屏时Activity会销毁在重新创建

    onPause --> onStop() --> onDestory() --> onCreate --> onStart --> onResume()

    开启新的activity获取他的返回值

    1.三个布局文件

    activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        xmlns:tools="http://schemas.android.com/tools"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:orientation="vertical"

        tools:context=".MainActivity" >

        <RelativeLayout

            android:layout_width="match_parent"

            android:layout_height="wrap_content" >

            <EditText

                android:id="@+id/et_contact"

                android:layout_width="match_parent"

                android:layout_height="wrap_content"

                android:layout_marginTop="14dp"

                android:hint="请输入联系人号码"

                android:inputType="text" >

            </EditText>

            <Button

                android:layout_alignBottom="@+id/et_contact"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_alignParentRight="true"

                android:layout_alignParentTop="true"

                android:onClick="selectContacts"

                android:text="选择联系人" />

        </RelativeLayout>

        <EditText

            android:id="@+id/et_content"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:inputType="textMultiLine"

            android:minLines="10" >

            <requestFocus />

        </EditText>

        <Button

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:onClick="send"

            android:text="发送" />

    </LinearLayout>

    activity_contacts.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        xmlns:tools="http://schemas.android.com/tools"

        android:layout_width="match_parent"

        android:layout_height="match_parent" >

        <ListView

            android:id="@+id/lv_contacts"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1" >

        </ListView>

    </LinearLayout>

    contact_item.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        xmlns:tools="http://schemas.android.com/tools"

        android:layout_width="match_parent"

        android:layout_height="match_parent" >

        <TextView

            android:layout_marginTop="5dp"

            android:id="@+id/tv_name"

            android:layout_width="90dp"

            android:layout_height="wrap_content"

            android:text="姓名"

            android:textSize="25sp" />

        <TextView

              android:layout_marginTop="5dp"

            android:id="@+id/tv_number"

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="10"

            android:text="号码"

            android:textSize="25sp" />

    </LinearLayout>

    2.2个Activity

    public class MainActivity extends Activity {

    private EditText et_contact;

    private EditText et_content;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    this.et_contact = (EditText) this.findViewById(R.id.et_contact);

    this.et_content = (EditText) this.findViewById(R.id.et_content);

    }

    public void selectContacts(View view) {

    Intent intent = new Intent(this, ContactActivity.class);

     this.startActivityForResult(intent, 0);

    }

    public void send(View view) {

    String number = this.et_contact.getText().toString().trim();

    String content = this.et_content.getText().toString();

    if (TextUtils.isEmpty(content)) {

    Toast.makeText(this, "内容不能为空!", 0).show();

    return;

    }

    if (TextUtils.isEmpty(number)) {

    Toast.makeText(this, "号码不能为空!", 0).show();

    return;

    }

    sendSms(number, content);

    ContentResolver resolver = this.getContentResolver();

    insertSms(number, content, resolver);

    Toast.makeText(this, "短信已发送!", 0).show();

    }

    private void insertSms(String number, String content,

    ContentResolver resolver) {

    Uri uri = Uri.parse("content://sms");

    ContentValues values = new ContentValues();

    values.put("address", number);

    values.put("type", 2);

    values.put("date", System.currentTimeMillis());

    values.put("body", content);

    resolver.insert(uri, values);

    }

    private void sendSms(String number, String content) {

    SmsManager manager = SmsManager.getDefault();

    ArrayList<String> contents = manager.divideMessage(content);

    for (String str : contents) {

    manager.sendTextMessage(number, null, str, null, null);

    }

    }

     @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (data != null) {

    String number = data.getStringExtra("number");

    et_contact.setText(number);

    }

    }

    }

    public class ContactActivity extends Activity {

    private ArrayList<HashMap<String, String>> smsInfos = new ArrayList<HashMap<String, String>>();

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_contacts);

    ListView lv_contacts = (ListView) this.findViewById(R.id.lv_contacts);

    smsInfos = this.getContacts();

    lv_contacts.setAdapter(new SimpleAdapter(this, smsInfos,

    R.layout.contact_item, new String[] { "name", "number" },

    new int[] { R.id.tv_name, R.id.tv_number }));

    lv_contacts.setOnItemClickListener(new OnItemClickListener() {

    @Override

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,

    long arg3) {

    HashMap<String, String> smsInfo = smsInfos.get(arg2);

    String number = smsInfo.get("number");

     Intent intent = new Intent();

    intent.putExtra("number", number);

    setResult(0, intent);

    finish();

    }

    });

    }

    private ArrayList<HashMap<String, String>> getContacts() {

    ArrayList<HashMap<String, String>> smsInfos = new ArrayList<HashMap<String, String>>();

    HashMap<String, String> smsInfo = null;

    ContentResolver resolver = this.getContentResolver();

    Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");

    Uri dataUri = Uri.parse("content://com.android.contacts/data");

    Cursor cursor = resolver.query(uri, null, null, null, null);

    while (cursor.moveToNext()) {

    String id = cursor.getString(cursor.getColumnIndex("contact_id"));

    if (id != null) {

    smsInfo = new HashMap<String, String>();

    Cursor dataCursor = resolver.query(dataUri, new String[] {

    "data1", "mimetype" }, "raw_contact_id=?",

    new String[] { id }, null);

    while (dataCursor.moveToNext()) {

    String data1 = dataCursor.getString(0);

    String mimetype = dataCursor.getString(1);

    if ("vnd.android.cursor.item/name".equals(mimetype)) {

    smsInfo.put("name", data1);

    }

    if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {

    smsInfo.put("number", data1);

    }

    }

    smsInfos.add(smsInfo);

    dataCursor.close();

    }

    }

    cursor.close();

    return smsInfos;

    }

    }

    3.授权

    <uses-permission android:name="android.permission.READ_CONTACTS"/>

    <uses-permission android:name="android.permission.WRITE_SMS"/>

    <uses-permission android:name="android.permission.SEND_SMS"/>

    <uses-permission android:name="android.permission.READ_SMS"/>

    activity的启动模式

    standard: 默认每次激活一个那么任务栈就放置一个新的Activity实例。默认是标准模式。

    singleTop栈顶只能保证有一个该Activity的实例。

    singleTask: 在当前任务栈中只能有一个实例,如果添加之前任务栈中已经有了该实例,那么已有的该实例以上的实例全部出栈,显示当前的实例。

    singleTop保证多个任务栈中只能有一个实例。

    使用场景:                                                                                                                

    standard  即将每次激活的Activity放入到任务栈栈顶。(一般不用,除非你不激活Activity)

    singleTop即每次进栈之前先判断栈顶是否有该Activity,有                  则不进,没有则进。但是依旧执行onNewIntent()方法。如:书签

    singleTask即保证任务栈中该Activity是单例,Activity01àActivity02àActivity01如果

    的Activity01被杀死。如:截屏

    singleInstance 该启动模式会单独的形成一个任务栈存储激活的Activity,让其他应用共享该

    Activity。如:其他应用直接使用打开的浏览器。

  • 相关阅读:
    泛型
    BigInteger和BigDecimal大数相加问题
    集合(Collection,set,list,map)
    [转]如何从MySQL官方Yum仓库安装MySQL5.6
    CentOS Linux使用crontab运行定时任务详解
    [转]Mysql自动备份并保存近15天记录脚本
    centos6.5 mysql安装+远程访问+备份恢复+基本操作+卸载
    vsftpd安装
    [转]CENTOS 6.5 配置YUM安装NGINX+服务器负载均衡
    [转]apache的源码安装详细过程全纪录
  • 原文地址:https://www.cnblogs.com/freenovo/p/4469827.html
Copyright © 2011-2022 走看看