Unit2:活动

1.基本用法

1.创建活动

Generate LayoutFile 创建布局文件
Launcher Activity 自动注册为主活动

编写顺序

  1. 活动Activity
  2. 注册.xml
  3. 界面res.xx

2.Toast使用

Activity中:

  Button button1 = findViewById(R.id.button_1);
  button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(FirstActivity.this,"you clicked Button 1", Toast.LENGTH_SHORT).show();    // 使用方法:Toast.makeText(上下文,文本,时长).show
        }
  });

res.Layout中:

  <Button
    android:id="@+id/button_1"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:text="Toast使用"
    />

3.Menu使用

Activity中:

 /**
 * 活动上添加menu菜单
 * @param menu
 * @return
 */
@Override
public boolean **onCreateOptionsMenu**(Menu menu) {              // 重写该方法启动menu
    getMenuInflater().inflate(R.menu.main,menu);
    return true;
}

/**
 * 给menu菜单添加功能
 * @param item
 * @return
 */
@Override
public boolean **onOptionsItemSelected**(@NonNull MenuItem item) {  // 将menu中的菜单栏配上事件
//        判断添加那个菜单项
   switch (item.getItemId()) {
       case R.id.add_item:
           Toast.makeText(this,"you clicked Add", Toast.LENGTH_SHORT).show();
           break;

       case R.id.remove_item:
           Toast.makeText(this,"you clicked Remove", Toast.LENGTH_SHORT).show();
           break;

       default:
   }
    return  true;
 }

res.menu中:

  <item
    android:id="@+id/add_item"
    android:title="Add"
    ></item>
  <item
    android:id="@+id/remove_item"
    android:title="Remove"
    ></item>

2.活动穿梭

Intent显示传递

Activity中:

  Button button3 = findViewById(R.id.button_3);
    button3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
              Intent intent = new Intent(FirstActivity.this, SecondActivity.class);  // 显示传送(开头,结尾)
              startActivity(intent);
        }
    });

Intent隐示传递

Activity中:

   Button button4 = findViewById(R.id.button_4);
    button4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent("com.example.activitytest.ACTION_START");   // 隐式传送(结尾)
            intent.addCategory("com.example.activitytest.MY_CATEGORY");
            startActivity(intent);

            Intent intent = new Intent(Intent.ACTION_VIEW);                         // 跳转百度
            intent.setData(Uri.parse("http://baidu.com"));
            startActivity(intent);

            Intent intent1 = new Intent(Intent.ACTION_DIAL);                        // 跳转拨号
            intent1.setData(Uri.parse("tel:10086"));
            startActivity(intent1);
        }
    });

.xml中配置:

  <activity android:name=".SecondActivity" android:label="second page">
        <intent-filter>
            <action android:name="com.example.activitytest.ACTION_START" />      // 自定义action,跳转时需要访问
            <category android:name="android.intent.category.DEFAULT" />          // 默认category,跳转时不需要编写
            <category android:name="com.example.activitytest.MY_CATEGORY" />     // 自定义category,跳转时需要访问
        </intent-filter>
    </activity>

信息的向上传递

第一个Activity中开启传送并接收:

  Button button6 = findViewById(R.id.button_6);
    button6.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(FirstActivity.this, ThirdActivity.class);
            startActivityForResult(intent, 1);
        }
    });

   /**
 * 接收上传数据
 * @param requestCode
 * @param resultCode
 * @param data
 */
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    switch (requestCode) {
        case 1:
            if(resultCode == RESULT_OK) {
                String ResultData = data.getStringExtra("data_result");
                Log.d("FirstActivity", ResultData);
            }
            break;
        default:
    }
}

第二个Acticity中接收发送数据:

   Button button = findViewById(R.id.button_t1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("data_result","hello,firstActivity");
                setResult(RESULT_OK,intent);
                finish();
            }
        });

  @Override
public void **onBackPressed()** {
    Intent intent = new Intent();
    intent.putExtra("data_result","hello,back!");
    setResult(RESULT_OK,intent);
    finish();
}

信息的向下传递

第一个Activity中传送:

   Button button5 = findViewById(R.id.button_5);
    button5.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
              String data = "hello secondActivity";
              Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
              intent.putExtra("extra_data",data);
              startActivity(intent);
        }
    });

第二个Activity中接收:

    Intent intent = getIntent();
    String data = intent.getStringExtra("extra_data");
    Log.d("SecondActivity", data);

3.活动生命周期

4.活动启动

更改.xml文件中的属性

  <activity
        android:name=".MainActivity"
        android:label="主页"
        android:launchMode="standard">   //更改属性,修改启动项********
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
名称 作用
默认 每次启动都创建一个新的活动
singleTop 可以防止自启动创建新的,但是其他活动启动,任然创建新的活动
singleTask 检查是否存在该活动,已经存在直接用。不存在,创建新的活动
singleInstance 新创建一个返回栈使用该活动

5.活动实践

1.检测运行的活动

编写BaseActivity类继承AppCompatActivity,其他活动继承该类,启动时打印出运行的活动名称:

 public class BaseActivity extends AppCompatActivity {
  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("BaseActivity", getClass().getSimpleName());   // 检测运行的活动名称
  }
}

2.统一销毁活动

编写活动管理器

  public class ActivityCollector {
      public static List<Activity> activities = new ArrayList<>();

      public static void addActivity(Activity activity) {
          activities.add(activity);
      }

      public static void removeActivity(Activity activity) {
          activities.remove(activity);
      }

      public static void finishAll() {
             for(Activity activity : activities) {
              if (!activity.isFinishing()) {
            activity.finish();
              }
          }
      }
  }

将活动管理器的初始化和销毁在BaseActivity中运行:

  public class BaseActivity extends AppCompatActivity {
      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          ActivityCollector.addActivity(this);  // 将活动放入管理器
      }

      @Override
      protected void onDestroy() {
          super.onDestroy();
          ActivityCollector.removeActivity(this);  //将活动在管理器中移除
      }
  }

之后就可以在继承了BaseActivity的活动中统一销毁所有的活动,退回界面了:

    Button button1 = findViewById(R.id.buttonf1);
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ActivityCollector.finishAll();                                   // 退出活动
            android.os.Process.killProcess(android.os.Process.myPid());      // 杀掉一个进程
        }
    });

3.最佳启动活动

对于需要参数访问的活动,最好建立一个actionStart()来时外界访问比较方便:

  public static void actionStart(Context context,String data1,String data2) {
    Intent intent = new Intent(context, 自己的名称.class);
    intent.putExtra("data1",data1);
    intent.putExtra("data2",data2);
    context.startActivity(intent);
  }
posted @ 2020-09-09 17:32  ssy197  阅读(110)  评论(0)    收藏  举报