无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)

1.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()方法。

2.activity的启动模式
standard: 默认每次激活一个那么任务栈就放置一个新的Activity实例。默认是标准模式。
singleTop:栈顶只能保证有一个该Activity的实例。
singleTask: 在当前任务栈中只能有一个实例,如果添加之前任务栈中已经有了该实例,那么已有的该实例以上的实例全部出栈,显示当前的实例。
singleTop:保证多个任务栈中只能有一个实例。
使用场景:
standard  即将每次激活的Activity放入到任务栈栈顶。(一般不用,除非你不激活Activity)
singleTop即每次进栈之前先判断栈顶是否有该Activity,有则不进,没有则进。但是依旧执行onNewIntent()方法。如:书签
singleTask即保证任务栈中该Activity是单例,Activity01àActivity02àActivity01如果
的Activity01被杀死。如:截屏
singleInstance 该启动模式会单独的形成一个任务栈存储激活的Activity,让其他应用共享该
Activity。如:其他应用直接使用打开的浏览器。

3.activity横竖屏切换的生命周期


4.开启新的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"/>

5.利用广播实现ip拨号
<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" >

    <EditText
        android:id="@+id/et_ip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >
    </EditText>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="save"
        android:text="保存" />

</LinearLayout>

public class MainActivity extends Activity {
    private EditText et_ip;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.et_ip = (EditText) this.findViewById(R.id.et_ip);
        SharedPreferences sf = this
                .getSharedPreferences("config", MODE_PRIVATE);
        this.et_ip.setText(sf.getString("ip", ""));
    }

    public void save(View view) {
        String ip = this.et_ip.getText().toString().trim();
        SharedPreferences sf = this
                .getSharedPreferences("config", MODE_PRIVATE);
        Editor edit = sf.edit();
        edit.putString("ip", ip);
        edit.commit();
        Toast.makeText(this, "保存完毕!", 0).show();
    }

}

自定义一个广播
public class OutCallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent arg1) {
        Toast.makeText(arg0, "电话通了。。。。", 0).show();
        System.out.println("电话通了。。。。");
        String number = getResultData();
        SharedPreferences sf = arg0.getSharedPreferences("config",
                Context.MODE_PRIVATE);
        String ip = sf.getString("ip", "");
        String newNumber = ip + number;
        setResultData(newNumber);
    }

}
<receiver android:name=".OutCallReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" >
                </action>
            </intent-filter>
</receiver>

6.短信接收广播
public class SmsReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "接收到新短信!", 1).show();
}

}

<activity
            android:screenOrientation="landscape"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:name="com.itheima.smsreciver.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>
<receiver android:name=".SmsReceiver">
   <intent-filter >
       <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
   </intent-filter>
</receiver>

7.短信监听器
1.自定义广播类
public class SmsListener extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for (Object pdu : pdus) {
SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu);
String body = message.getMessageBody();
String sender = message.getOriginatingAddress();
System.out.println("body = " + body);
System.out.println("sender = " + sender);
if ("5556".equals(sender)) {
// 终止广播
abortBroadcast();
SmsManager manager = SmsManager.getDefault();
manager.sendTextMessage(sender, null, "i hite you", null, null);
}

}
}

}

2.授权
   <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>
<receiver android:name=".SmsListener">
    <intent-filter android:priority="1000">
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>
时间: 2024-12-26 21:07:11

无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)的相关文章

Android--纠正Activity横竖屏切换的生命周期的错误

1.本机测试环境 android 4.3, android:targetSdkVersion : 12,13,17 2.关于横竖屏切换的Activity生命周期的错误说法 初学Android,在学习Activity的生命周期时,自己在本机实验时,发现了一些不合理的情况. 那就是在横竖屏切换时,Activity并不会像网上大多数人所说的那样: 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次. 设置Activi

Android横竖屏切换的生命周期

现在的手机默认情况下可以横竖屏切换,但是横竖屏切换的生命周期是怎么样的,今天就来说明一下,以防你开发的app横竖屏时game over 1.在不做任何配置的情况下,加载一个activity的打印日志: 切换屏幕时方向的打印日志: ps:我这里没出现什么横屏切换竖屏时执行两次oncreate,个人觉得不对 2.配置android:configChanges="keyboardHidden|orientation|screenSize"时,屏幕切换时,不会出现重启activity 3.配置

Intent七大属性,Activity的启动方式,横竖屏切换的生命周期,现场保护--&gt;

---------------------------------Intent七大属性------------------------------------- 第一类:启动,有ComponentName(显式),Action(隐式),Category(隐式). 第二类:传值,有Data(隐式),Type(隐式),Extra(隐式.显式). 第三类:启动模式,有Flag. ---------------------------------------Activity的启动方式----------

Fragment和Activity生命周期以及横竖屏切换对生命周期的影响

Fragment生命周期图解,fragment和activity生命周期对比 生命周期变化 : 切换到该Fragment 05-21 14:26:35.095: D/FragmentDemo(7649): onAttach 05-21 14:26:35.095: D/FragmentDemo(7649): onCreate 05-21 14:26:35.095: D/FragmentDemo(7649): onCreateView 05-21 14:26:35.100: D/FragmentDe

android开发之activity横竖屏切换时的生命周期以及横竖屏切换时的资源适配方案

背景:之前有过两篇写activity的博客 android之activity的生命周期详解:详细介绍了activity的整个生命周期.各状态间的转换和返回桌面时保存activity的状态 android之activity中onSaveInstanceState和onRestoreInstanceState的触发时机:介绍了activity中这两个方法的触发时机和作用 本篇博客会牵扯到里面的内容,如果你都有所了解可以直接往下看,如果不了解可以进去回忆下. 问题:在做应用的退出对话框时,发现如果对话

Android横竖屏切换生命周期

转自xiaoQLuhttp://www.cnblogs.com/xiaoQLu/p/3324503.html 开源帮助android获得了飞速的发展,开源也导致了数不清的碎片问题.android的前期系统就是一个半成品,不成熟的系统以及google的快速迭代开发,导致厂家完全跟不上google的步伐,你2.3的bug还没改完,4.0就出来了,4.0的bug还在处理,4.1出来了,最后的结果就是,手机厂家给每部手机一个系统版本,并且不能升级.最后苦逼的就是广大的程序猿们,你不得不考虑从2.1到4.

Activity嵌套多个Fragment实现横竖屏切换

一.上图 二.需求 近期项目遇到个横竖屏切换的问题,较为复杂,在此记之. 1.Activity中竖屏嵌套3个Fragment,本文简称竖屏FP1,FP2,FP3. 2.其中竖屏FP1与FP2可以切换为横屏的FL1,FL2,即竖屏FP1切换到对应的横屏FL1,竖屏FP2对应切换到横屏FL2. 3.FP3不允许横竖屏切换. 4.竖屏FP1,FP2,FP3用ViewPager实现左右滑动切换. 5.横屏的FL1,FL2用布局中的切换按扭实现左右切换,不允许滑动切换. 看到这需求有点儿晕菜了吧!!!呵呵

Android Configuration横竖屏切换时Activity生命周期调用

问题:横竖屏切换时Activity的生命周期? 测试环境:华为mate7 package com.virglass.beyond.activity; import android.app.Activity; import android.content.res.Configuration; import android.os.Bundle; import com.virglass.beyond.utils.LogUtil; /** * 系统设置更改 * @author Administrator

Android之Activity生命周期及横竖屏切换

Activity有三个状态: 当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或运行状态.它就是响应用户操作的Activity. 当它失去焦点但仍然对用户可见时(如右图),它处于暂停状态.即在它之上有另外一个Activity.这个Activity也许是透明的,或者没有完全覆盖全屏,所以被暂停的Activity仍对用户可见.暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但系统处于极低内存时仍然可以杀死这个Activity. 完全被另一个Activ