• 《第一行代码》第二章


    《第一行代码》第二章总结

    上一章总结是在看完后写的,感觉遗漏很多,从这章起是边阅读边总结。

    由于有了新的事情,《第一行代码》的总结要停一段时间,但不会太久。


    手动创建活动

    • 选择 Add No Activity ,创建一个活动。
    • 在res 下创建 layout 文件夹,在文件夹下创建 first_layout 布局。
    • 在布局中添加一个按钮。
    • 在活动中加载布局。
    • 在AndroidManifest 文件中注册。
    • 在AndroidManifest 中配置主活动,在内部加入

    在活动中使用Toast():

    • 在 onCreat()中添加。

      Button button1 = (Button) findViewById(R.id.button_1);
      button1.setOnClickListener(new View.OnClickListener(){					//注册监听器
          public void onClick(View v){
              Toast.makeText(MainActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
          }
      
      });
      
    • 通过findViewById()方法获得布局元素,返回的是View对象,(Button)转型成Button对象。

    • 为按钮注册监听器。

      • makeText ( Context对象, 文本内容, 时长).show()。 时长有:Toast.LENGTH_SHORT 与 Toast.LENGTH_LONG

      Ps:在这里设置了自动导包

    @+id/xxx 在 xml 定义一个id

    @id/xxx 在 xml 引入一个id


    在活动中使用Menu:

    • res下创建menu文件夹,创建main,创建标签创建菜单项。

      <item
          android:id="@+id/app_item"
          android:title="Add"/>
      <item
          android:id="@+id/remove_item"
          android:title="Remove"/>
      
    • 在活动中添加onCreatetionsMenu(),使用getMenuInflater().inflate(R.menu.main,menu),第一个参数为创建菜单的资源文件,第二个参数为菜单项添加到的Menu对象。

      public boolean onCreateOptionsMenu(Menu menu) {
          getMenuInflater().inflate(R.menu.main,menu);
          return true;
      }
      
    • 定义菜单响应事件,在活动中重写onOptionsItemSelected(),通过调用item.getItemId() 来判断我们点击的是哪一个菜单项。

      public boolean onOptionsItemSelected(MenuItem item){
          switch (item.getItemId()){
              case R.id.app_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;
      }
      


    销毁一个活动:

    • 修改按钮监听器中的代码(我把之前的代码注释掉了):

      button1.setOnClickListener(new View.OnClickListener(){
          public void onClick(View v){
              //Toast.makeText(MainActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
              finish();
          }
      
      });
      

    Intent篇

    使用显式Intent

    Ps:Intent是Android程序中各组件之间进行交互的一种重要方式。

    • 创建第二个活动

    • 修改第一个活动中按钮的点击事件(同样注释):

      button1.setOnClickListener(new View.OnClickListener(){
          public void onClick(View v){
              //Toast.makeText(MainActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
              //finish();
              Intent intent = new Intent(MainActivity.this,SecondActivity.class);
              startActivity(intent);
          }
      
      });
      
    • 先构建Intent ,传入MainActivity.this 作为上下文,传入 SecondActivity.class 作为目标活动。

    • 通过startActivity()方法执行Intent。

    • 按下back键销毁当前活动,回到上一个活动。


    使用隐式Intent

    • 标签下配置 的内容

      <activity android:name=".SecondActivity">
          <intent-filter>
              <action android:name="com.example.androidtest.ACTION_START"/>
              <category android:name="android.intent.category.DEFAULT"/>
          </intent-filter>
      </activity>
      
    • 修改MainActivity中按钮的点击事件

      button1.setOnClickListener(new View.OnClickListener(){
          public void onClick(View v){
              //Toast.makeText(MainActivity.this, "You clicked Button 1", Toast.LENGTH_SHORT).show();
              //finish();
              //Intent intent = new Intent(MainActivity.this,SecondActivity.class);
              //startActivity(intent);
              Intent intent = new Intent("com.example.androidtest.ACTION_START");
              startActivity(intent);
          }
      
      });
      
    • 标签声明当前活动可以响应 com.example.androidtest.ACTION_START 这个活动, 标签包含了一些附加信息,更精确指明当前活动能够响应的Intent中还可能带有的category。只有同时匹配上Intent 中指定的action 和 category 时,这个活动才能响应该 Intent。

    • android.intent.category.DEFAULT 是一种默认的 category ,在调用 startActivity 方法时会自动将这个category 添加到 Intent 中。


    更多隐式Intent

    • 修改主活动为

      button1.setOnClickListener(new View.OnClickListener(){
          public void onClick(View v){
              Intent intent = new Intent(Intent.ACTION_VIEW);		//指定Intent的action为Intent.ACTION_VIEW,为安卓内置动作
            
         intent.setData(Uri.parse("http://www.baidu.com"));
              startActivity(intent);	//通过Uri.parse()方法,将网址字符串解析成Uri对象,再调用setData()方法传递这个Uri对象。
      
    • setData()接受一个Uri对象,用于指定当前Intent正在操作的数据。


    接上

    • 创建活动 ThirdActivity 与 third_layout

    • 在 AndroidManifest.xml中注册

    • 进行配置

      <activity android:name=".ThirdActivity"
                  tools:ignore="AppLinkUrlError">
                  <intent-filter>
                      <action android:name="android.intent.action.VIEW"/>
                      <category android:name="android.intent.category.DEFAULT"/>
                      <data android:scheme="http"/>
                  </intent-filter>
              </activity>
      
    • tools:ignore="AppLinkUrlError" 通过提示增加!


    向下一个活动传递数据

    • 修改主活动:

      public void onClick(View v){
          String data = "Hello SecondActivity";
          Intent intent = new Intent(MainActivity.this,SecondActivity.class);
          intent.putExtra("extra_data",data);	//接受两个参数,第一个是键
          startActivity(intent);
      }
      
    • 修改 SecondActivity :

      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.second_layout);
          Intent intent = getIntent();	//获取用于启动SecondActivity的Intent
          String data = intent.getStringExtra("extra_data");
          Log.d("SecondActivity",data);
      }
      

    返回数据给上一个活动

    • 主活动中写入:

      public void onClick(View v){
          Intent intent = new Intent(MainActivity.this,SecondActivity.class);
          startActivityForResult(intent,1);	//在活动销毁的时候返回一个结果给上一个活动。第二个参数是请求码,用于在之后的回调中判断数据的来源。
      }
      
    • SecondActivity:

      button2.setOnClickListener(new View.OnClickListener(){
          public void onClick(View v){Intent intent = new Intent();
              intent.putExtra("data_return","Hello 主活动");
              setResult(RESULT_OK, intent);	//重要!专门用于上一个活动返回数据。第一个参数用于向上一个活动返回处理结果,一般只用RESULT_OK 或 RESULT_CANCELED这两个值,第二个参数则吧带有数据的Intent 传递回去。
              finish();}	//销毁活动
      });
      
      • 主活动重写 onActivityResult(): 回调的方法
      protected void onActivityResult(int requestCode,int resultCode, Intent data) {	//第一个参数是活动传入的请求码1,第二个参数是在返回数据时传入的处理结果RESULT_OK。
          super.onActivityResult(requestCode, resultCode, data);  //注意
          switch (requestCode) {
              case 1:
                  if (requestCode == RESULT_OK) {
                      String returnedData = data.getStringExtra("data_return");
                      Log.d("MainActivity", returnedData);
                  }
                  break;
              default:
          }
      }
      

    通过back返回

    • 在以上的基础上,在SecondActivity 中重写:

      public void onBackPressedf(){
          Intent intent = new Intent();
          intent.putExtra("data_return","Hello 主活动");
          setResult(RESULT_OK,intent);
          finish();
      }
      


    活动周期篇

    • 每个活动在其生命周期中最多可能会有4种状态。
      • 运行状体
      • 暂停状态
      • 停止状态
      • 销毁状态

    体验活动的生命周期

    • 新建项目,创建主活动、两个子活动(NormalActivity、DialogActivity)与对应的布局。两个子活动布局各添加一个TextView,主活动布局添加两个button。

    • 修改AndroidManifest.xml:

      <activity android:name=".DialogActivity" android:theme="@android:style/Theme.Dialog"></activity>
      
    • 修改主活动代码:

      展开查看
      private static final String TAG = "MainActivity";
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          Button startNormalActivity = (Button) findViewById(R.id.start_normal_activity);
          Button startDialogActivity = (Button) findViewById(R.id.start_dialog_activity);
          startNormalActivity.setOnClickListener(new View.OnClickListener(){
              public void onClick(View v){
                  Intent intent = new Intent(MainActivity.this,NormalActivity.class);
                  startActivity(intent);
              }
          });
          startDialogActivity.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  Intent intent = new Intent(MainActivity.this,DialogActivity.class);
              }
          });
      }
      @Override
      protected void onStart() {
          super.onStart();
          Log.d(TAG,"onStart");
      }
      @Override
      protected void onResume() {
          super.onResume();
          Log.d(TAG,"onResume");
      }
      @Override
      protected void onPause() {
          super.onPause();
          Log.d(TAG,"onPause");
      }
      @Override
      protected void onStop() {
          super.onStop();
          Log.d(TAG,"onStop");
      }
      @Override
      protected void onDestroy() {
          super.onDestroy();
          Log.d(TAG,"onDestory");
      }
      @Override
      protected void onRestart() {
          super.onRestart();
          Log.d(TAG,"onRestart");
      } 
      

    活动的启动模式

    standard

    • standard是活动默认的启动模式。
    • 使用standard模式的活动,每次启动都会创建该活动的一个新的实例。

    singelTop

    • 启动活动时若发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不再创建新的活动实例。

    • 修改AndroidManifest.xml:

      在activity标签内加android:launchMode="singleTop"

    singelTask

    • 每次启动活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果发现没有就会创建一个新的活动实例。

    singleInstance*

    • 指定为singleInstance 模式的活动会启用一个新的返回栈来管理这个活动

    了解当前活动的技巧

    • 新建一个类(Java Class):无需注册

      public class BaseActivity extends AppCompatActivity {		//继承AppCompatActivity!
          @Override
          protected void onCreate(@Nullable Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              Log.d("BaseActivity",getClass().getSimpleName());
          }
      }
      
    • 让所有类继承 BaseActivity

    出现的问题

    • 每次运行出现这样的错误信息:…… E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008cdf
      …… E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008824
    • 按照示例在隐式Intent活动中添加intent.addCategory(……)没有按照书里说的报错但程序运行终止了。
    • 在<体验活动生命周期>处的试验中,点击第二个对话的按钮没反应,程序也没报错,网上两个方法都没用。
  • 相关阅读:
    Android学习笔记_76_Android ProgressBar 进度条
    继承ViewGroup学习onMeasure()和onLayout()方法
    ListView异步加载网络图片完美版之双缓存技术
    Android onMeasure 方法的测量规范MeasureSpec
    ActionBar 的应用
    三种方法解决android帮助文档打开慢
    onInterceptTouchEvent和onTouchEvent调用关系详解 ...
    Android 滑动效果汇总
    Android学习笔记_79_ Android 使用 搜索框
    Android学习笔记_JNI_c调用java代码
  • 原文地址:https://www.cnblogs.com/zzzketi/p/13247163.html
Copyright © 2020-2023  润新知