移動開發(三)Activity 和Kotlin

1.Activity

1.1Activity生命週期

在這裏插入圖片描述

  1. onCreate()會在Activity第一次被創建的時候調用。
    你應該在這個方法中完成Activity的初始化操作
  2. onStart()這個方法再Actity由不可見的時候調用
  3. onResume() 這個方法再Activity準備好和用戶進行交互時調用
    此時Activity一定位於棧頂,並處於運行狀態
  4. onPause()這個方法再系統準備啓動或恢復另一個Actity的時候調用。
    我們通常會再這個方法中將一些消耗cpu的資源釋放掉,以及保存一些關鍵數據
    但這個方法執行速度一定要快,不然會影響到新的棧頂
  5. onStop()這個方法在Activity完全不可見的時候調用
    它和onPause()的區別在於,如果啓動的新的Activity是一個對話框式的Activity,那麼onPause()會執行,而onStop()不會執行
  6. onRestart()這個方法在Activity由停止變爲運行狀態之前調用,也就是Activity被重新啓動了
    以上7個方法又可以分爲以下3種生存期
    完整生存期 onCreate()和onRestart()
    可見生存期 onStart()和onStop()
    前臺生存期 onResum()和onPause()

1.2Activity啓動模式
1.standard 默認啓動模式 每當啓動一個新的Activity,它就會在返回棧種入棧,並處於棧頂每次啓動都會
創建一個該Activity的新實例
2.singleTop 在啓動Activity時如果發現返回棧的棧頂已經是該Activity,則直接使用它,不會創建Activity
的新實例
3.singleTask 每次啓動該Activity時,系統都會在返回棧種檢查是否存在該Activity實例,如果發現有
則直接使用 ,並把這個Activity上所有其他Activity統統出棧
4.singleInstance 會有一個單獨的返回棧來管理這個Activity。不管哪個應用程序調用這個Activity,
都會共用一個返回棧
在 中添加android:launchMode來選擇啓動模式
示例

 <activity android:name=".MainActivity" android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

1.3Activity傳遞數據


class SecondActivity : AppCompatActivity() {
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when(requestCode){
            1 -> if(resultCode == Activity.RESULT_OK){
                //
                val returnedData = data?.getStringExtra("extra_return")
                Toast.makeText(this,returnedData,Toast.LENGTH_SHORT).show()
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
        web.setOnClickListener {
            val intent=Intent(Intent.ACTION_VIEW)
            intent.data= Uri.parse("http://www.rshome.xn--ses554g/")
            startActivity(intent)
        }
        phone.setOnClickListener {
            val intent=Intent(Intent.ACTION_DIAL)
            intent.data = Uri.parse("tel:10086")
            startActivity(intent)
        }
        tranf.setOnClickListener {
            val intent = Intent(this,ThirdActivity::class.java)
            intent.putExtra("extra_data","爺問你話呢!?")
            //   startActivity(intent)

            startActivityForResult( intent,1)
        }

    }

  
    //Activity被回收前調用,用來保存數據
    override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) {
        super.onSaveInstanceState(outState, outPersistentState)
        val TempData = "用來保存被銷燬前的數據的"
        outState.putString("data_key",TempData)
  
    }

修改onCreate()添加以下代碼

...
  if(savedInstanceState!=null){
     val tempData = savedInstanceState.getString("data_key")
        //獲得Activity被銷燬前保存到數據
        }
...        
 
    
    /*
            Activity最佳實踐
            1.知道自己在哪個Activity中
             override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
        Log.d("BaseActivity",javaClass.simpleNaame)
        }
            kotlin中BaseActivity::Class.java相當於獲取BaseActivity類的class對象 相當於BaseActivity.class
                    javaClass表示獲取當前實例的Class對象,simpleName獲取當前實例的類名
            
            2.隨時隨地退出程序
            新建一個單例類ActivityCollector
            object ActivityCollector{
                private val activitys = ArrayList<Activity>()
                
                fun addActivity(activity : Activity){
                activitys.add(activity)
                }
            
                fun removeActivity(activity : Activity){
                activitys.remove(activity)
                }
                fun finishAll(){
                for(activity in activities){
                    if(!activity.isFinishing){
                    activity。finish()
                    }
                }
                
                }
            }

                
            }
            
     */
   

1.4啓動Activity最佳寫法
解決需要傳入參數標準問題
class SecondActivity : BaseActivity(){
companion object{
fun actionStart(context : Context,data1 : String,data2 : String){
val intent=Intent(context,SecondAActivity::class.java)
intent.putExtra(“param1”,data1)
intent.putExtra(“param2”,data2)
context.startActivity(intent)
}
}

Kotlin課堂 標準函數和靜態方法

Kotlin課堂 標準函數和靜態方法
1.1. with

   val result = with(obj){
        //這裏時obj上下文
        "value"// with  函數的返回值
        }

1.2 run

    val result = obj.run{
        //這裏時obj上下文
        "value"// run  函數的返回值
        }

1.3 apply

    val result = obj.apply{
        //這裏時obj上下文
        
        }
        // result == obj

** 定義靜態方法**
kotlin弱化了靜態方法,提供了更好的解決方法,單例類
1.1註解
在單例類或companion object中加入@JvmStatic注

  class Util{
    
    companion object{
    @JvmStatic
    fun do(){
    println("do static")
    }
    }
    
    }

1.2頂層方法
創建一個Kotlin文件,在次文件定義任何方法都是頂層方法。都會編譯成靜態方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章