Android開発の第9週の学習の概要

前に書く

久しぶりに、ついにハトはスプリントに直面して拾われた。過去数週間、私は一生懸命プレーしすぎて、ビジネスを忘れていました。以下の正式な調査を開始します。
最近、アクティビティの内容を学びました。これはAndroidの4つの主要コンポーネントの1つであり、おそらく最も基本的なものです。

AndroidManifest.xmlについて

このファイルは、プロジェクトファイルを説明するために存在します。4つのコンポーネントがすべて正しく動作するには、マニフェストファイルに登録する必要があります。図に示すように、

applicationはAPPの完全な名前であり、アプリプロジェクト全体を表します。APPアイコン、名前、その他の属性を設定できます。
以下は登録の活動報告です。アプリケーションのスタートアップエントリなどを設定するために使用されるインテントフィルタリングが含まれています。

インターフェースジャンプ

明示的なインテントアプリのジャンプ

実装は次のコードのように非常に簡単です。

                //显式启动的第一种写法
                Intent intent = new Intent();
               intent.setClass(MainActivity.this,SecondActivity.class);
                startActivity(intent);

                //显式启动的第二种写法
               Intent intent1 = new Intent();
               intent1.setClassName(MainActivity.this,"com.test.activitiyleanring.SecondActivity");
               startActivity(intent1);

                //显式启动的第三种写法
               Intent intent = new Intent();
               ComponentName componentName = new ComponentName(MainActivity.this,SecondActivity.class);
              intent.setComponent(componentName);
             startActivity(intent);

実際、通常の状況下では、私たちは全員これを書きます(最もよく使われる方法):

Intent intent = new Intent(this,SecondActivity.classs);
startActivity(intent);

暗黙的なアプリ内アクティビティのジャンプ

                //隐式启动的第一种写法
                Intent intent = new Intent("abcd.SecondActivity");
                startActivity(intent);
                //隐式启动的第二种写法
                Intent intent = new Intent();
                intent.setAction("abcd.SecondActivity");
                startActivity(intent);

いわゆる暗黙的インテントは、実際にどのアクティビティを開始するかが明確ではなく、アクティビティディレクトリから読み取ります。

明示的な意図と暗黙的な意図の使用?

そんなに多くを言ったので、私も困惑しています。暗黙の意図はとても厄介です、なぜ彼を使うのですか?実際、それはサードパーティのアプリケーション(携帯電話のカメラの呼び出しなど)を開始することです。
次に、サードパーティのアプリケーションを明示的および暗黙的に開始する方法を見てみましょう。

サードパーティのアプリケーションを起動する明示的な意図

    /**
     * 这个方法会在点击按钮的时候执行
     *
     * @param view 这个其实是我们点击的button
     *             <p>
     *             其实组件的名称 ComponentName = 包名/类得路径名称,如果类和前面的包名一样就可以省略成.
     *             <p>
     *             以下这种方式是显式意图跳转到浏览器界面
     */
    public void skip2BrowserVisible(View view) {
        Log.d(TAG, "skip2Browser");
        Intent intent = new Intent();
        //第一种写法
        //intent.setClassName("com.android.chrome","com.android.browser.BrowserActivity");
        //第二种写法
        ComponentName componentName = new ComponentName("com.android.chrome", "com.android.browser.BrowserActivity");
        intent.setComponent(componentName);
        startActivity(intent);
    }

ご覧のとおり、パッケージ名などを探す必要があり大変面倒です。
暗黙のスタートアップはどうですか?

サードパーティのアプリケーションを起動する暗黙の意図

   /**
     * 下面我们通过隐式意图跳转到浏览器界面
     * 步骤:
     * 1.创建Intent对象
     * 2.给Intent对象设置Action值,设置它的category值,如果5.1以上系统需要设置包名
     * 3.startActivity来跳转到另外一个界面
     *
     * @param v
     */
    public void skip2BrowserInvisible(View v) {
        Intent intent = new Intent();
//        <intent-filter>
//        <action android:name="android.intent.action.SEARCH" />
//        <category android:name="android.intent.category.DEFAULT" />
//        </intent-filter>
        intent.setAction("android.intent.action.SEARCH");
        intent.addCategory("android.intent.category.DEFAULT");
        intent.setPackage("com.android.browser");
        startActivity(intent);
    }

ご覧のとおり、暗黙的な起動は比較的簡単です。これが、サードパーティアプリケーションの起動に暗黙的な起動がよく使用される理由です。

インターフェースジャンプパス値を実現

値渡し

まずコードを見てください:

    private void initListener() {
        mLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //这里面也就是登陆按钮被点击了
                Log.d(TAG,"login被点击了");
                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方法来跳转
        /**
         * 这部分是用于显式意图跳转到另外一个Activity
         */
        //Intent intent = new Intent(this,SecondActivity.class);
        Intent intent = new Intent();
        String packageName = this.getPackageName();
        String  targetActivityClsName = SecondActivity.class.getName();
        intent.setClassName(packageName,targetActivityClsName);
        Log.d(TAG,"packageName "+packageName);
        Log.d(TAG,"className "+ targetActivityClsName);

        intent.putExtra("account",accountText);
        intent.putExtra("password",passwordText);
        startActivity(intent);

ご覧のとおり、putExtraメソッドを使用して値を配置し、2番目のインターフェースでそれを受け取ります。

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);
        TextView info = this.findViewById(R.id.info);
        Intent intent = getIntent();
        String account = intent.getStringExtra("account");
        String password = intent.getStringExtra("password");
        Log.d(TAG,"account =="+account);
        Log.d(TAG,"password =="+password);
        info.setText("您的账号是:"+account+"  密码是:"+password);

    }
}

同様に、オブジェクトなども渡すことができますが、ユーザークラスはシリアル化する必要があり(Parcelableを実装)、次にputExtraメソッドを使用します。

コールバック

                Intent intent = new Intent(MainActivity.this,PayActivity.class);
                //第一步,使用startActivityForResult代替原来的startActivity
                startActivityForResult(intent,PAY_REQUEST_CODE);
    /**
     * 返回的结果会在这里回调
     * @param requestCode
     * @param resultCode
     * @param data
     */
    @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");
            }
            mPayResultText.setText(resultContent);
        }
    }

コールバックは少し面倒です。まず、startActivityForResultメソッドを使用してから、onActivityResultメソッドを上書きして、コールバックパラメータを取得する必要があります。

活動ライフサイクル

また、onCreate、onStart、onResume、onPause、onStop、onDestroyのライフサイクルが順番に移動することも学習しました。その中でも、通常、データをonDestroyメソッドに格納してから、onCreateメソッドで復元します。

アクティビティのライフサイクルに対する水平および垂直画面の影響

水平および垂直の画面では、アクティビティが破棄されて再起動されるため、開発が困難になります。現時点では、修正して構成できます。

android:configChanges="keyboardHidden|screenSize|orientation"

おすすめ

転載: www.cnblogs.com/wushenjiang/p/12709229.html