栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android学习-day4(四大组件之activity)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android学习-day4(四大组件之activity)

文章目录
  • 0、学习任务及进度
  • 1、Activity
    • 1.1、关于AndroidManifest.xml
    • 1.2、Activity之间的跳转
      • 1.2.1、通过意图实现界面跳转
        • 1.2.1.1、显示意图
        • 1.2.1.2、隐式意图
      • 1.2.2、通过意图实现跳转至第三方应用
        • 1.2.2.1、显示意图
        • 1.2.2.2、隐式意图
      • 1.2.3、显示意图和隐式意图的区别
    • 1.3、界面之间的数据传递
      • 1.3.1、基本数据类型
      • 1.3.2、对象
      • 1.3.3、例子
      • 1.3.4、打电话
      • 1.3.5、发送短信
    • 1.4、数据回传
      • 1.4.1、requestCode和resultCode![在这里插入图片描述](https://img-blog.csdnimg.cn/70101fd15ada4e11a6705810c271b5d7.png)
    • 1.5、第三方应用打开系统相机数据回传UI部分
    • 1.6、Activity的生命周期
      • 1.6.1、onCreate()和onDestory()
      • 1.6.2、onStart()和onStop()
      • 1.6.3、onResume()和onPause()
    • 1.7、Activity启动模式、任务栈
      • 1.7.1、任务栈
      • 1.7.2、启动模式

0、学习任务及进度
  • 四大组件-activity
1、Activity 1.1、关于AndroidManifest.xml



1.2、Activity之间的跳转
  • 要实现页面的跳转并且把数据传到另外一个界面(类似JavaWeb中的登陆重定向显示)
1.2.1、通过意图实现界面跳转 1.2.1.1、显示意图

显示意图一般用于应用内组件的跳转。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private EditText mAccount;
    private EditText mPassword;
    private Button mLogin;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initListener();
    }

    private void initListener() {
        mLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: ");
                handlerLogin();
            }
        });
    }

    private void handlerLogin() {
        String accountText = mAccount.getText().toString().trim();
        if (TextUtils.isEmpty(accountText)) {
            Toast.makeText(this,"输入账号为空", Toast.LENGTH_SHORT).show();
            return;
        }
        String passwordText = mPassword.getText().toString().trim();
        if (TextUtils.isEmpty(passwordText)) {
            Toast.makeText(this,"输入密码为空", Toast.LENGTH_SHORT).show();
            return;
        }
        //传入另外一个界面
        //创建一个意图对象,通过startActivity方法进行跳转
        Intent intent = new Intent(this,SecondActivity.class);//跳转到了SecondActivity
        intent.putExtra("account",accountText);
        intent.putExtra("password",passwordText);
        startActivity(intent);
    }

    private void initView() {
        mAccount = this.findViewById(R.id.account);
        mPassword = this.findViewById(R.id.password);
        mLogin = this.findViewById(R.id.login);
    }
}

SecondActivity.java(要进行注册)

public class SecondActivity extends Activity {
    private static final String TAG = "SecondActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);


        Intent intent = getIntent();
        String account = intent.getStringExtra("account");
        String password = intent.getStringExtra("password");
        Log.d(TAG, "account: " + account);
        Log.d(TAG, "password: " + password);

        TextView info = this.findViewById(R.id.info);
        info.setText("账号为"+ account + "密码为" + password);
    }
}

AndroidManifest.xml




    
        
            
                

                
            
        



        

        
    


activity_main.xml



    

    
    
    
    

activity_second.xml



    

    

效果:


1.2.1.2、隐式意图

隐式意图一般用于应用之间的跳转。

MainActivity.java

private void handlerLogin() {
        String accountText = mAccount.getText().toString().trim();
        if (TextUtils.isEmpty(accountText)) {
            Toast.makeText(this,"输入账号为空", Toast.LENGTH_SHORT).show();
            return;
        }
        String passwordText = mPassword.getText().toString().trim();
        if (TextUtils.isEmpty(passwordText)) {
            Toast.makeText(this,"输入密码为空", Toast.LENGTH_SHORT).show();
            return;
        }

        
        
        Intent intent = new Intent();
        intent.setAction("com.example.LOGIN_INFO");
//        intent.addCategory("android.intent.category.DEFAULT");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.putExtra("account",accountText);
        intent.putExtra("password",passwordText);
        startActivity(intent);

    }

ThirdActivity.java

public class ThirdActivity extends Activity {
    private static final String TAG = "ThirdActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        Intent intent = getIntent();
        String account = intent.getStringExtra("account");
        String password = intent.getStringExtra("password");
        Log.d(TAG, "account: " + account);
        Log.d(TAG, "password: " + password);

        TextView info = this.findViewById(R.id.info);
        info.setText("账号为"+ account + "密码为" + password);
    }
}

AndroidManifest.xml




    
        
            
                

                
            
        



        

        



        
            
                
                
            
        


    


1.2.2、通过意图实现跳转至第三方应用
  • 目标就是进行跳转到浏览器

找到cmp(windows下:adb logcat | find “cmp”)
因为是可以显示的看见跳转到哪个类,所以是显示意图

1.2.2.1、显示意图

Skip2BrowserActivity.java

public class Skip2BrowserActivity extends Activity {
    private static final String TAG = "Skip2BrowserActivity";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.skip2browser);
    }

    
    public void skip2browser(View view){
        Log.d(TAG, "执行到skip2browser方法");


        Intent intent = new Intent();
//        //第一种写法
//        intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");

        //第二种写法
        ComponentName componentName = new ComponentName("com.android.browser","com.android.browser.BrowserActivity");
        intent.setComponent(componentName);
        startActivity(intent);
    }
}

AndroidManifest.xml




    
        
            
                

                
            
        



        

        



        
            
                
                
            
        







    


Skip2BrowserActivity.xml





    
1.2.2.2、隐式意图

Skip2BrowserActivity.java

    public void skip2browserInvisible(View view){
        Intent intent = new Intent();

        
        intent.setAction("android.intent.action.SEARCH");
        intent.addCategory("android.intent.category.DEFAULT");
        intent.setPackage("com.android.browser");
        startActivity(intent);
    }

activity_skip2browser.xml





    
1.2.3、显示意图和隐式意图的区别

显示:知道要跳转到哪个。
隐式:不知道要跳转到哪个。

1.3、界面之间的数据传递 1.3.1、基本数据类型

目标:实现基本的数据类型的传递

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    
    public void skip2Second(View view){
        Intent intent = new Intent(this,SecondActivity.class);
//        intent.putExtra("intKey",100);
        startActivity(intent);
    }


}

SecondActivity.java

public class SecondActivity extends Activity {
    private static final String TAG = "SecondActivity";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Intent intent = getIntent();
        if (intent != null) {
            //没有就返回-1
            int intValue = intent.getIntExtra("intKey", -1);
            Log.d(TAG, "intValue == " + intValue);
        }

    }
}

注册

1.3.2、对象

User类

public class User implements Parcelable {
    private String name;
    private int age;
    private int tall;

    public User() {
    }

    public User(String name, int age, int tall) {
        this.name = name;
        this.age = age;
        this.tall = tall;
    }

    protected User(Parcel in) {
        name = in.readString();
        age = in.readInt();
        tall = in.readInt();
    }

    public static final Creator CREATOR = new Creator() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getTall() {
        return tall;
    }

    public void setTall(int tall) {
        this.tall = tall;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
        dest.writeInt(tall);
    }
}

MainActivity.java

    public void sendObject(View view){
        
        Intent intent = new Intent(this,SecondActivity.class);
        User user = new User();
        user.setAge(10);
        user.setName("asdsa");
        user.setTall(90);
        intent.putExtra("userKey",user);
        startActivity(intent);
    }

SecondActivity.java

if (intent != null) {
            //没有就返回-1
            int intValue = intent.getIntExtra("intKey", -1);
            Log.d(TAG, "intValue == " + intValue);


            User user = intent.getParcelableExtra("userKey");
            if (user != null) {
                Log.d(TAG, "userName ==" + user.getName());
                Log.d(TAG, "userAge ==" + user.getAge());
                Log.d(TAG, "userTall ==" + user.getTall());
            }
        }

    }
1.3.3、例子

注册登陆的例子

LoginActivity.java

ublic class LoginActivity extends Activity {

    private EditText mUsername;
    private EditText mPassword;
    private Button mRegister;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        initView();

        ///监听事件
        initListener();
    }

    private void initListener() {
        mRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handleRegister();
            }
        });
    }

    private void handleRegister() {
        String username = mUsername.getText().toString().trim();
        if (TextUtils.isEmpty(username)) {
            Toast.makeText(this,"账号为空",Toast.LENGTH_SHORT).show();
            return;
        }
        String password = mPassword.getText().toString().trim();
        if (TextUtils.isEmpty(password)) {
            Toast.makeText(this,"密码为空",Toast.LENGTH_SHORT).show();
            return;
        }
        //进行注册
        Intent intent = new Intent(this,RegisterResultActivity.class);
        intent.putExtra("usernameKey",username);
        intent.putExtra("passwordKey",password);
        startActivity(intent);
        this.finish();//上一个界面结束
    }

    private void initView() {
        mUsername = this.findViewById(R.id.username_et);
        mPassword = this.findViewById(R.id.password_et);
        mRegister = this.findViewById(R.id.register_btn);

    }
}

RegisterResultActivity.java

public class RegisterResultActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);
        TextView result = this.findViewById(R.id.register_result);

        Intent intent = getIntent();
        if (intent != null) {
            String username = intent.getStringExtra("usernameKey");
            result.setText(username + "注册成功");
        }
    }
}

activity_login.xml




    


    

    

activity_result.xml



    

1.3.4、打电话

MainActivity.java

    public void phone10086(View view){
        Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:10086"));

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            //在这里面向系统请求权限,如果没有在这里面处理,不会执行下面的方法了
            //这里就是向系统请求权限了,这里我还做了一个判断. sdk是M(M = 23 android L)才做这个请求,否则就不做.
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(new String[]{"android.permission.CALL_PHONE"}, 111);
            }
            return;
        }
        startActivity(intent);
    }

增加权限


1.3.5、发送短信

MainActivity.java

public void sendMessage(View view){
        Intent intent = new Intent();
        intent.setAction("com.example.componentdatadeliver.SEND.MSG");
        intent.addCategory("android.intent.category.DEFAULT");
        intent.putExtra("targetNumberKey","10086");
        intent.setData(Uri.parse("msg:查询电话费"));
        startActivity(intent);
    }

SendMsgActivity.java

public class SendMsgActivity extends Activity {

    private static final String TAG = "SendMsgActivity";
    private EditText mReceiverNumber;
    private EditText mMsgContent;
    private Button mSendMsgBtn;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_msg);


        //找控件
        initView();

        Intent intent = getIntent();
        if (intent != null) {
            String targetNumberKey = intent.getStringExtra("targetNumberKey");
            Log.d(TAG, "targetNumberKey == " + targetNumberKey);
            mReceiverNumber.setText(targetNumberKey);
            Uri data = intent.getData();
            Log.d(TAG, "data == " + data);
            if (data != null) {
                String msg = data.toString().replace("msg", "");
                mMsgContent.setText(msg);
            }
        }
    }

    private void initView() {
        mReceiverNumber = this.findViewById(R.id.receiver_number_et);
        mMsgContent = this.findViewById(R.id.msg_content_et);
        mSendMsgBtn = this.findViewById(R.id.send_msg_btn);
    }
}

注册

  
            
                
                
                
            
        
1.4、数据回传

背景:第一个界面点击充值按钮,跳转到第二个界面进行充值,会告诉第一个界面结束(成功、失败)

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private Button mCharge;
    private TextView mPayResult;
    private static final int PAY_REQUEST_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

        initListener();
    }

    private void initListener() {
        mCharge.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //进行充值
                hanlder();
            }
        });
    }

    private void hanlder() {
        Intent intent = new Intent(this,PayActivity.class);
//        startActivity(intent);
        //不选择使用startActivity(),而使用startActivityForResult()
        startActivityForResult(intent,PAY_REQUEST_CODE);
    }

    private void initView() {
        mCharge = this.findViewById(R.id.charge_btn);
        mPayResult = this.findViewById(R.id.pay_result);
    }

    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PAY_REQUEST_CODE) {
            String resultContent = null;
            if (resultCode == 2) {
                //充值成功
                resultContent = data.getStringExtra("resultContent");
            }else if(resultCode == 3){
                //取消充值
                resultContent = data.getStringExtra("resultContent");
            }
            mPayResult.setText(resultContent);
        }
    }
}

PayActivity.java

public class PayActivity extends Activity {

    private EditText mInput;
    private Button mPayBtn;
    private Button mCancel;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pay);

        initView();

        initListener();
    }

    private void initListener() {
        mCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handleCancel();
            }
        });

        mPayBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handlePay();
            }
        });

    }

    private void handleCancel() {
        Intent intent = new Intent();
        intent.putExtra("resultContent","充值取消");
        setResult(3,intent);
        finish();
    }

    private void handlePay() {
        String payNumber = mInput.getText().toString().trim();
        if (TextUtils.isEmpty(payNumber)) {
            Toast.makeText(this,"未输入充值金额",Toast.LENGTH_SHORT).show();
            return;
        }

        //进行充值

        //返回
        Intent intent = new Intent();
        intent.putExtra("resultContent","充值成功");
        setResult(2,intent);

        //结束界面
        finish();
    }

    private void initView() {
        mInput = this.findViewById(R.id.pay_input_et);
        mPayBtn = this.findViewById(R.id.pay_btn);
        mCancel = this.findViewById(R.id.cancel_pay_btn);
    }
}
1.4.1、requestCode和resultCode

请求码: 因为在一个Activity中了以向其他任何Activity进行跳转,通过请求码判断是否是改Activity发出的
结果码:对一个请求的处理的不同结果。

1.5、第三方应用打开系统相机数据回传UI部分

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_CODE = 1;
    private ImageView mResultContainer;
    private ImageView mTakePhotoBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initListener();
    }

    private void initListener() {
        mTakePhotoBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //按钮被点击之后,需要跳转到系统的相机界面
                handler();
            }
        });
    }

    private void handler() {
        Intent intent = new Intent();
        //调用系统相机
        intent.setAction("android.media.action.IMAGE_CAPTURE");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        startActivityForResult(intent,REQUEST_CODE);
    }

    private void initView() {
        mResultContainer = this.findViewById(R.id.photo_result_container);
        mTakePhotoBtn = this.findViewById(R.id.take_photo);
    }

    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE) {
            if (requestCode == Activity.RESULT_OK && data != null) {
                //成功返回
                Bitmap result = data.getParcelableExtra("data");
                if (result != null) {
                    mResultContainer.setImageBitmap(result);
                }
            }else if(requestCode == Activity.RESULT_CANCELED){
                //取消或者失败
                Toast.makeText(this,"取消拍照",Toast.LENGTH_SHORT).show();
            }
        }
    }
}
1.6、Activity的生命周期

中文文档

1.6.1、onCreate()和onDestory()


如何实现在后台程序切换的时候,数据回显,总结一下思路:

步骤
1、重写onDestory(),把数据保存到sharePreferences中
2、判断内容是否为空,不空,那么进入编辑模式,拿到编辑器、保存数据、提交。
3、通过偏好设置得到内容、再输入到控件中。

1.6.2、onStart()和onStop()

举了一个例子,就是在观看电影的时候如何在接电话时视频暂停以及接听完点完继续播放视频。

1.6.3、onResume()和onPause()

理解一下六个动作:

  1. 第一次启动应用,依次调用onCreate()、onStart()、onResume()。
  2. 当切换到第二个界面的时候,第一个界面逐渐失去焦点,执行onPause(),onStop()之后第一个界面不可见。
  3. 最后当应用程序退出的时候,调用onDestory()。
1.7、Activity启动模式、任务栈 1.7.1、任务栈

以写短信为例:

1.7.2、启动模式

四种模式:

直接看作者的笔记,写的很详细



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/891147.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号