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="第一个活动"> <!-- .FirstActivity是com.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中指定的action和category时,这个活动才能响应该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 id,Task 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);//指定action是Intent.ACTION_VIEW(Android内置动作) // intent.setData(Uri.parse("http://www.baidu.com")); // //将一个网址字符串解析成一个Uri对象 // //再调用Intent的setData()方法将这个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(在活动1、2中分别创建一个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","你好 FirstActivity(BACK键)"); 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():获取到用于启动SecondActivity的Intent // //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_OK或RESULT_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()方法,并调用ActivityCollector的removeActivity()方法,表明将一个马上要销毁的活动从活动管理器中移除 @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(); } } } }