ActivityTest

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitytest">

    <!-- 任何一个活动都要在这里(AndroidManifest.xml:安卓系统清单)注册!!!!!!!!!!!!!!(很重要) -->
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <!--
         android:icon 用来指定应用图标
         android:label 用来指定应用名称
        -->

        <!-- 注册活动 -->
        <activity
            android:name=".FirstActivity"
            android:launchMode="singleTask"
            android:label="第一个活动">
            <!--
            .FirstActivitycom.example.activitytest.FirstActivity的缩写
            android:launchMode:修改启动模式
            android:label:应用名和打开应用后上方显示的名字
            -->

            <!-- 注册显示Intent -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <!--LAUNCHER:启动器-->
            </intent-filter>
        </activity>
        <!-- 注册第二个活动 -->
        <!-- 由于SecongdActivity不是主活动所以不需要配置 <intent-filter> -->
        <activity android:name=".SecondActivity"
            android:launchMode="singleInstance">

            <!-- 注册隐式Intent -->
            <!-- 每个Intent只能指定一个action,但可以指定多个category -->
            <intent-filter>
                <action android:name="com.example.activitytest.ACTION_START" />
                <!-- 表示当前活动可以响应 com.example.activitytest.ACTION_START 这个action -->
                <category android:name="android.intent.category.DEFAULT" /> <!-- 这是一种默认的category -->
                <!--
                更精确的指明了当前的活动能够响应的Intent中还可能带有的category                只有<action><category>中的内容能够匹配上Intent中指定的actioncategory时,这个活动才能响应该Intent
                -->
                <category android:name="com.example.activitytest.MY_CATEGORY" />
            </intent-filter>
        </activity>
        <activity android:name=".ThirdActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="http"/>
                <!--指定了数据协议必须是http协议-->
            </intent-filter>
        </activity>
    </application>

</manifest>

first_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--添加按钮-->
    <Button
        android:id="@+id/button_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 1"
        />
    <!--android:id:给当前元素定义唯一标识符
    width:宽,match_parent:让当前元素和父元素一样宽
    height:高,wrap_content:表示当前元素高度只要刚好包含里面的内容就行
    android:text:指定元素中显示的文字内容
    -->

</LinearLayout>

FirstActivity.java

package com.example.activitytest;

import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

//import static android.content.Intent.ACTION_DIAL;

public class FirstActivity extends BaseActivity {

    //使用onActivityResult()方法接收SecondActivity传递回来的数据
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //onActivityResult()方法参数:
    // 1.启动活动是传入的请求码
    // 2.在返回数据时传入的处理结果
    // 3.携带着    返回数据的Intent
        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK) {
                    String returnData = data.getStringExtra("data_return");
                    Log.d("FirstActivity",returnData);
                }
                break;
            default:
        }
        //1.通过requestCode判断来源:是否从SecondActivity返回的
        //2.通过resultCode判断处理结果是否成功
        //2.data中取值并打印出来
    }

    //测试singleTask启动模式    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d("singleTask启动模式活动1","onRestart");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        //添加一行打印信息,用于打印当前活动的实例:
//        Log.d("活动1启动模式",this.toString());

        Log.d("FirstActivity","Task id is " + getTaskId());
        //getTaskId()方法:获得Task idTask id不同说明不在一个栈中

        setContentView(R.layout.first_layout);
        //给按钮注册点击事件
        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener(){  //创建监听器,用setOnClickListener()方法
            @Override
            public void onClick(View v){

//                //创建Toast提醒
//                Toast.makeText(FirstActivity.this,"点击成功!",  //用静态方法makeText()创建一个Toast对象
//                //参数:1.Context:Toast要求的上下文(因为活动本身就是一个Context对象所以直接传入FirstActivity.this即可)
//                //2.Toast显示的文本内容
//                //3.Toast显示的时长
//                        Toast.LENGTH_SHORT).show();  //调用show()Toast显示出来
//                finish();//:销毁活动,即退出应用

//                //创建显式 Intent :一般应用在应用的界面跳转
//                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
//                startActivity(intent);

//                //创建隐式Intent :一般应用于跨应用跳转
//                Intent intent = new Intent("com.example.activitytest.ACTION_START");//可以匹配action
//                //category为默认,在调用startActivity()方法是会自动将这个category添加到Intent//                intent.addCategory("com.example.activitytest.MY_CATEGORY");
//                startActivity(intent);

//                //进入百度
//                Intent intent = new Intent(Intent.ACTION_VIEW);//指定actionIntent.ACTION_VIEW(Android内置动作)
//                intent.setData(Uri.parse("http//www.baidu.com"));
//                //将一个网址字符串解析成一个Uri对象
//                //再调用IntentsetData()方法将这个Uri对象传递进去
//                startActivity(intent);

//                Uri uri = Uri.parse("http://www.baidu.com");
//                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
//                startActivity(intent);

//                //进入拨打电话界面
//                Intent intent = new Intent(ACTION_DIAL);   //Android系统内置动作
//                intent.setData(Uri.parse("tel:10086"));
//                startActivity(intent);

//                Uri uri = Uri.parse("tel:10086");
//                Intent intent = new Intent(Intent.ACTION_DIAL,uri);
//                startActivity(intent);

                //传递数据给下一个活动
//                String data = "Hello SecondActivity";
//                //使用显示Intent启动SecondActivity
//                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
//                //使用putExtra()方法传递字符串,putExtra()方法有两个参数
//                //第一个参数是键,用于后面从Intent中取值
//                //第二个参数是真正要传递的数据
//                intent.putExtra("extra_data",data);
//                startActivity(intent);

//                //返回数据给上一个活动
//                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
//                startActivityForResult(intent,1);
//                //startActivityForResult()方法用于启动活动(活动销毁的时候能够返回一个结果给上一个活动),有两个参数:
//                //1.intent
//                //2.请求码:用于在之后的回调中判断数据的来源(请求码只要是一个唯一值就可以,这里传入“1”
//                //四种启动模式:
//                Intent intent = new Intent(FirstActivity.this,FirstActivity.class);
//                startActivity(intent);
//                // 1.standard模式:系统会重复创建栈顶活动
//                //这里要看logcat:连续点几次按钮,发现需要多次点击BACK才能退出程序
//                //2.singleTop:每次启动活动系统会检查栈顶
//                //不管按多少次按钮都不会有新的打印信息出现
//
//                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
//                startActivity(intent);
//                //同样需要多次点击BACK

//                //3.singleTask(在活动12中分别创建一个onRestart()onDestroy()方法):
//                //每次启动活动时系统会检查栈中是否有该活动的实例
//                //若发现则直接使用该实例,并把这个活动之上的所有活动出栈
//                //若未发现则创建一个新的活动实例
//
//                //测试singleInstance启动模式
            }
        });
    }

    @Override
    //创建菜单,快捷键ctrl+o
    public boolean onCreateOptionsMenu(Menu menu) {
        //重写onCreateOptionsMenu()方法
        getMenuInflater().inflate(R.menu.main,menu);
        //inflate()方法接受两个参数
        //1.R.menu.main,menu:用于指定我们通过哪个资源文件来创建菜单
        //2.这里直接使用onCreateOptionsMenu()方法中传入的menu参数
        //然后给这个方法返回值:true代表显示菜单:false代表不显示
        return true;
    }

    @Override
    //创建菜单的Toast提示
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.add_item:
                Toast.makeText(this,"点击Add",Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(this,"点击Remove",Toast.LENGTH_SHORT).show();
                break;
            default:
        }
        return true;
    }
}

second_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 2"/>

</LinearLayout>

SecondActivity.java

package com.example.activitytest;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import static android.app.Activity.RESULT_OK;

public class SecondActivity extends BaseActivity {

    //onBackPressed():当用户没有点击BUTTON2按钮返回,而使用BACK返回时用此方法返回数据
    @Override
    public void onBackPressed() {
        Intent intent = new Intent();
        intent.putExtra("data_return","你好 FirstActivityBACK键)");
        setResult(RESULT_OK,intent);
        finish();

    }

    //测试singleTask启动模式    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("singleTask启动模式活动2","onDestroy");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        Log.d("活动2启动模式",this.toString());

        Log.d("SecondActivity","Task id is " + getTaskId());
        setContentView(R.layout.second_layout);
//        //接收FirstActivity中传递的数据,运行后可以通过logcat查看
//        Intent intent = getIntent();
//        String data = intent.getStringExtra("extra_data");
//        Log.d("SecondActivity",data);
//        //getIntent():获取到用于启动SecondActivityIntent
//        //getStringExtra():获取传递的数据(如果是整型数据,则使用getIntExtra()方法,以此类推...
        //给按钮注册点击事件
        Button button2 = (Button) findViewById(R.id.button_2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

//                //BUTTON2返回上一级时返回数据的方法:
//                Intent intent = new Intent();
//                intent.putExtra("data_return","你好 FirstActivity");
//                setResult(RESULT_OK,intent);
//                //setResult()方法:用于向上一级返回数据,setResult()方法接收两个参数:
//                //1.用于向上一级返回处理结果(一般只使用RESULT_OKRESULT_CANCELD这两个值)
//                //2.把带有数据的Intent传递回去
//                //然后调用finish()方法销毁当前活动
//                finish();
//                //SecondActivity销毁之后会回调上一个活动的onActivityResult()方法
//                // 因此要在FirstActivity中重写这个方法来得到返回的数据

//                //测试singleTop启动模式下日志内容(查看logcat//                Intent intent = new Intent(SecondActivity.this,FirstActivity.class);
//                startActivity(intent);
//                //由于栈顶位置是活动2,所以会创建新的活动1

                //测试singleInstance启动模式                Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
                startActivity(intent);

            }
        });

    }
}

third_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 3"/>

</LinearLayout>

ThirdActivity.java

package com.example.activitytest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class ThirdActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //测试singleInstance启动模式        Log.d("ThirdActivity","Task id is " + getTaskId());
        setContentView(R.layout.third_layout);

        //创建按钮点击事件
        Button button3 = (Button) findViewById(R.id.button_3);
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ActivityCollector.finishAll();
                //ActivityCollector.finishAll()方法:不管想在什么地方退出程序,只要调用此方法就可以。
                android.os.Process.killProcess(android.os.Process.myPid());
                //也可以加上这句杀掉当前进程,以保证程序完全退出
                //killProcess():用于杀掉一个进程,它接收一个进程id参数,可以通过myPid()方法来获得当前进程的id
                //——这个方法只能用于杀掉当前程序的进程,不能用于杀掉其他程序
            }
        });
    }
}

BaseActivity.java

package com.example.activitytest;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

/**
 * Created by Administrator on 2018/2/6 0006.
 */

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("BaseActivity",getClass().getSimpleName());
        //表明将当前正在创建的活动添加到活动管理器里
        ActivityCollector.addActivity(this);
    }

    //重写onDestroy()方法,并调用ActivityCollectorremoveActivity()方法,表明将一个马上要销毁的活动从活动管理器中移除
    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }
}

ActivityCollector.java

package com.example.activitytest;

import android.app.Activity;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2018/2/7 0007.
 */

//活动管理器
public class ActivityCollector {
    public static List<Activity>activities = new ArrayList<>();

    public static void addActivity(Activity activity) {
    //addActivity()方法:用于向List中添加一个活动
        activities.add(activity);
    }
    public static void removeActivity(Activity activity) {
    //removeActivity()方法:用于从List中移除活动
        activities.remove(activity);
    }
    public static void finishAll() {
    //finishAll()方法:用于将List中储存的活动全部销毁掉
        for (Activity activity : activities) {
            if (!activity.isFinishing()) {
                activity.finish();
            }
        }
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值