Android08

Android08

隐式意图和显式意图

  • 显式意图

    intent.setClass(MainActivity.this, CalcActivity.class);
    
    Intent intent = new Intent(this, ResultActivity.class);
    
    intent.setClassName("com.itheima.twointent", "com.itheima.twointent.Activity01");
    
  • 隐式意图

    <activity android:name="com.itheima.twointent.Activity01" >
    </activity>
    <activity android:name="com.itheima.twointent.Activity02" >
        <intent-filter>
            <action android:name="com.itheima.twointent.OPEN02" />
    
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    
    
    //隐式意图
    public void start02(View view) {
        Intent intent = new Intent();
        intent.setAction("com.itheima.twointent.OPEN02");
        intent.addCategory("android.intent.category.DEFAULT");
        startActivity(intent);
    }
    

显式意图和隐式意图的特点

  1. 是否需要配置清单文件意图过滤器 显式(不需要) 隐式(需要)
  2. 是否能够被其他的应用程序启动 显式(不能够) 隐式(可以)
  3. 启动效率 显式(高) 隐式(低)
  4. 实际应用场景 显式(多) 隐式(少)

隐式意图的详细参数

<activity android:name="com.itheima.intentdemo.DemoActivity">
    <intent-filter >
        <action android:name="com.itheima.intentdemo.XXXX"/>
        <data android:mimeType="text/plain" />
        <data android:scheme="itheima"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>


 public void click(View view){
    Intent intent = new Intent();
    //action 动作
    //泡茶 泡妞
    intent.setAction("com.itheima.intentdemo.XXXX");
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    //      intent.setData(Uri.parse("itheima://afaf"));
    //      intent.setType("text/plain");
    intent.setDataAndType(Uri.parse("itheima://afaf"), "text/plain");
    startActivity(intent);
}

利用隐式意图打开系统的浏览器

//    <intent-filter>
//    <action android:name="android.intent.action.VIEW" />
//    <category android:name="android.intent.category.DEFAULT" />
//    <category android:name="android.intent.category.BROWSABLE" />
//    <data android:scheme="http" />
//    <data android:scheme="https" />
//    <data android:scheme="about" />
//    <data android:scheme="javascript" />
//</intent-filter>

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.tv_link).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //激活系统的另外一个应用程序.
                Intent intent = new Intent();
                intent.setAction("android.intent.action.VIEW");//可以只写一个,写后面的一个
                intent.addCategory("android.intent.category.DEFAULT");
                intent.addCategory("android.intent.category.BROWSABLE");//category要写2个对应
                intent.setData(Uri.parse("http://www.itheima.com"));//scheme只写一个
                startActivity(intent);
            }
        });
    }

利用隐式意图激活短信发送的应用

 // <intent-filter>
    // <action android:name="android.intent.action.VIEW" />
    // <action android:name="android.intent.action.SENDTO" />
    // <category android:name="android.intent.category.DEFAULT" />
    // <category android:name="android.intent.category.BROWSABLE" />
    // <data android:scheme="sms" />
    // <data android:scheme="smsto" />
    // </intent-filter>
    public void click(View view) {
        for (int i = 0; i < 100; i++) {
            Intent intent = new Intent();
            intent.setAction("android.intent.action.SENDTO");
            intent.addCategory("android.intent.category.DEFAULT");
            intent.addCategory("android.intent.category.BROWSABLE");
            intent.setData(Uri.parse("smsto:"));
            intent.putExtra("sms_body",
                    "推荐你使用一款软件,名字叫人品计算器,我测试出来的结果好准确呀,下载地址,http://bbs.itheima.com");
            startActivity(intent);
        }
    }

短信助手的ui

    public void selectSmsContent(View view) {
        Intent intent = new Intent(this, SmsListActivity.class);
        // startActivity(intent);
        // 开启新的Activity并且获取返回值
        startActivityForResult(intent, 1);
    }

    setContentView(R.layout.activity_smslist);
        lv = (ListView) findViewById(R.id.lv);
        lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item, smsMessages));

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1) {
            System.out.println("我们开启的新的选择短信的界面被关闭了,结果数据返回到这里");
            if (data != null) {
                String message = data.getStringExtra("message");
                et_message.setText(message);
            }
        }else if(requestCode == 2) {
            System.out.println("我们开启的新的选择联系人界面被关闭了,结果数据返回到这里");
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

开启新的界面获取返回值

    // 开启新的界面 选择联系人
    public void selectContact(View view) {
        Intent intent = new Intent(this, ContactListActivity.class);
        // startActivity(intent);
        // 开启新的Activity并且获取返回值
        startActivityForResult(intent, 2);
    }

    setContentView(R.layout.activity_contactlist);
    lv_contact = (ListView) findViewById(R.id.lv_contact);
    lv_contact.setAdapter(new ArrayAdapter<String>(this, R.layout.item, objects));

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1) {
            System.out.println("我们开启的新的选择短信的界面被关闭了,结果数据返回到这里");
            if (data != null) {
                String message = data.getStringExtra("message");
                et_message.setText(message);
            }
        }else if(requestCode == 2) {
            System.out.println("我们开启的新的选择联系人界面被关闭了,结果数据返回到这里");
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    <activity android:name="com.itheima.smshelper.SmsListActivity" />
    <activity android:name="com.itheima.smshelper.ContactListActivity" />

请求码和结果码

    // 开启新的界面 选择短信内容
    startActivityForResult(intent, 1);  
    setResult(0, data);//区分同一个Activity返回的不同数据


    // 开启新的界面 选择联系人      
    startActivityForResult(intent, 2);

     @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1) {
            System.out.println("我们开启的新的选择短信的界面被关闭了,结果数据返回到这里");
            if (data != null) {
                String message = data.getStringExtra("message");
                et_message.setText(message);
            }
        }else if(requestCode == 2) {
            System.out.println("我们开启的新的选择联系人界面被关闭了,结果数据返回到这里");
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

Activity的生命周期-创建和销毁

 //当Activity被创建的时候调用的方法
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.println("oncreate");
    }

    //当Activity被销毁的时候调用的方法
    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.out.println("onDestroy");
    }
    //打开页面和关闭页面,返回

Activity生命周期-显示与隐藏

    //Activity界面用户可见的时候调用的方法
    @Override
    protected void onStart() {
        System.out.println("onstart");
        super.onStart();
    }
    //Activity界面用户不再可见的时候调用的方法.
    @Override
    protected void onStop() {
        System.out.println("onstop");
        super.onStop();
    }
    //打开页面和关闭页面,home建

Activity生命周期-暂停和继续

  //获取焦点
    @Override
    protected void onResume() {
        System.out.println("onresume");
        super.onResume();
    }
    //失去焦点,暂停
    @Override
    protected void onPause() {
        System.out.println("onpause");
        super.onPause();
    }

       <activity
        android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
        <!--透明的视图-->

       @Override
    protected void onRestart() {
        System.out.println("onrestart");
        super.onRestart();
    }
    //当第一个调到第二个,在返回第一个页面时,第一个页面重新启动时,调用onRestart();

Activity生命周期的总结

Activity01—>Activity02—>Activity03

onCreate(创建) onStart(可见) onResume(获取焦点) onRestart(重新可见) onPause(失去焦点) onStop(不可见) onDestroy(销毁)

从Activity01—>Activity02 是

01onPause 02onCreate 02onStart 02onResume 01onStop

从Activity02—>Activity03 是

02onPause 03onCreate 03onStart 03onResume 02onStop

从Activity03—>Activity02 是返回 03onDestroy

03onPause 03onStop 03onDestroy 02onRestart(重新可见) 02onStart 02onResume 

从Activity02 是 home 02onDestroy不销毁

02onPause 02onStop 

横竖屏切换的生命周期

Activity横竖屏切换

  • 在activity横竖屏切换的时候默认是销毁当前的activity,然后重新初始化activity
    在清单文件里配置

    android:screenOrientation="portrait" 
    portrait-->一直是竖屏
    landspace --> 一直是横屏
    固定activity的显示模式,这样就不会重走一次生命周期
    

或者配置

android:configChanges="keyboardHidden|screenSize|orientation"
这样的话就算横竖屏切换了,不会影响activity,也就不会重走一次生命周期

Activity的任务栈

  • 就是栈中放的是任务(Activity活动),先进的Activity01,Activity02,Activity03,出是Activity03,Activity02,Activity01

singletop的启动模式

  • standard 标准 (默认)

特点:当你通过startActivity() 启动的activity的实例的引用就会放置在任务栈 每次启动都会创建一个新的实例

  • singleTop 独占顶端

    <activity android:name="com.itheima.launchmode.SecondActivity"
        android:launchMode="singleTop" >
    </activity>
    

singleTop独占顶端
特点:如果activity已经在栈顶,那么不会创建新的实例,而会复用栈顶的Activity. 如果不再栈顶,创建新的实例

singletask的启动模式

singleTask 单任务栈
特点:如果任务栈里面出现了activity,那么就会清空该activity上面所有的activity,再重用该Activity

singleinstance启动模式

singleInstance 单实例
特点:如果activity的启动模式设置了singleInstance 这样的activity会单独存放在一个任务栈里面。并且这样的实例只会有一份引用。

08-03 16:06:20.769640 19957 19996 I Finsky:background: [1511] abos.i(257): DL: Data loader session turned off due to Incremental install not requested: com.vkontakte.android 08-03 16:06:20.771626 17853 17939 W [0]DCS : Common Record event failed. DCS reject event: [appId=20089,logTag=20089,eventId=high_power_notification] . Pls check server config. 08-03 16:06:20.771625 19957 20053 I Finsky:background: [1539] abos.i(257): DL: Data loader session turned off due to Incremental install not requested: com.vkontakte.android 08-03 16:06:20.772463 19957 20033 I Finsky:background: [1528] ahqg.accept(444): IV2: Setting install scenario: 1 08-03 16:06:20.775159 19957 20033 E Finsky:background: [1528] ahqk.e(13): SM: Session creation failed with errorCode=5404 08-03 16:06:20.775159 19957 20033 E Finsky:background: java.lang.IllegalStateException: Too many active sessions for UID 10105 08-03 16:06:20.775159 19957 20033 E Finsky:background: at android.os.Parcel.createExceptionOrNull(Parcel.java:3280) 08-03 16:06:20.775159 19957 20033 E Finsky:background: at android.os.Parcel.createException(Parcel.java:3256) 08-03 16:06:20.775159 19957 20033 E Finsky:background: at android.os.Parcel.readException(Parcel.java:3239) 08-03 16:06:20.775159 19957 20033 E Finsky:background: at android.os.Parcel.readException(Parcel.java:3181) 08-03 16:06:20.775159 19957 20033 E Finsky:background: at android.content.pm.IPackageInstaller$Stub$Proxy.createSession(IPackageInstaller.java:626) 08-03 16:06:20.775159 19957 20033 E Finsky:background: at android.content.pm.PackageInstaller.createSession(PackageInstaller.java:820) 08-03 16:06:20.775159 19957 20033 E Finsky:background: at aick.a(PG:1121) 08-03 16:06:20.775159 19957 20033 E Finsky:background: at azfu.d(PG:3) 08-03 16:06:20.775159 19957 20033 E Finsky:background: at azfw.run(PG:38) 08-03 16:06:20.775159 19957 20033 E Finsky:background: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156) 08-03 16:06:20.775159 19957 20033 E Finsky:background: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651) 08-03 16:06:20.775159 19957 20033 E Finsky:background: at qhu.run(PG:29) 08-03 16:06:20.775159 19957 20033 E Finsky:background: at java.lang.Thread.run(Thread.java:1119) 08-03 16:06:20.775659 19957 19996 E Finsky:background: [1511] vlg.a(744): IV2: failed to create session for [Package:com.vkontakte.android, isid:Zrt6iUigSkC5hZ276rtG0w] statusCode=5404. 08-03 16:06:20.776402 19957 19996 E Finsky:background: [1511] nob.a(1005): IV2: request install failure for [Package:com.vkontakte.android, isid:Zrt6iUigSkC5hZ276rtG0w] 08-03 16:06:20.776402 19957 19996 E Finsky:background: com.google.android.finsky.installercommon.InstallerException: Status: 5404 08-03 16:06:20.776402 19957 19996 E Finsky:background: at vlg.a(PG:751) 08-03 16:06:20.776402 19957 19996 E Finsky:background: at azfu.d(PG:3) 08-03 16:06:20.776402 19957 19996 E Finsky:background: at azfw.run(PG:38) 08-03 16:06:20.776402 19957 19996 E Finsky:background: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156) 08-03 16:06:20.776402 19957 19996 E Finsky:background: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651) 08-03 16:06:20.776402 19957 19996 E Finsky:background: at qhu.run(PG:29) 08-03 16:06:20.776402 19957 19996 E Finsky:background: at java.lang.Thread.run(Thread.java:1119) 08-03 16:06:20.776619 1489 15125 D PipelineWatcher: onInputBufferReleased: frameIndex not found (620); ignored 08-03 16:06:20.779817 19957 19996 I Finsky:background: [1511] afco.a(317): SCU: Failed to abandon the session for com.vkontakte.android[iid:571] [isid:Zrt6iUigSkC5hZ276rtG0w] due to 5426, msg: Optional[No open Session with Context {name=com.vkontakte.android versionCode=40084} was found.] 08-03 16:06:20.780957 1134 1134 E HWC2 : Invalid CT ID. displayId: 0 08-03 16:06:20.781598 19957 19996 I Finsky:background: [1511] vmc.k(23): IV2: stopping install timeout for 571 08-03 16:06:20.789833 19957 19996 E Finsky:background: [1511] mrz.apply(202): IV2: Rejecting request for [Package:com.vkontakte.android, isid:Zrt6iUigSkC5hZ276rtG0w] statusCode: 5404 08-03 16:06:20.789833 19957 19996 E Finsky:background: com.google.android.finsky.installercommon.InstallerException: Status: 5404 08-03 16:06:20.789833 19957 19996 E Finsky:background: at vlg.a(PG:751) 08-03 16:06:20.789833 19957 19996 E Finsky:background: at azfu.d(PG:3) 08-03 16:06:20.789833 19957 19996 E Finsky:background: at azfw.run(PG:38) 08-03 16:06:20.789833 19957 19996 E Finsky:background: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156) 08-03 16:06:20.789833 19957 19996 E Finsky:background: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651) 08-03 16:06:20.789833 19957 19996 E Finsky:background: at qhu.run(PG:29) 08-03 16:06:20.789833 19957 19996 E Finsky:background: at java.lang.Thread.run(Thread.java:1119) 08-03 16:06:20.792809 1489 15125 D PipelineWatcher: onInputBufferReleased: frameIndex not found (621); ignored 08-03 16:06:20.796250 19957 19992 I Finsky:background: [1507] vqq.Y(19): IQ: start evaluating install requests. 08-03 16:06:20.797786 1134 1134 E HWC2 : Invalid CT ID. displayId: 0 08-03 16:06:20.800636 19957 20004 I Finsky:background: [1518] vqq.Q(41): IQ: Notifying installation update. [Package:com.vkontakte.android, isid:Zrt6iUigSkC5hZ276rtG0w], status=INSTALL_ERROR, status_code=5404, reason=single_install, tsc=PT1.332S, attempt=0
最新发布
08-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值