0

我有三個視圖和一個活動。 MainActivity - MainController - PushedController - NotificationOpenController。如何處理Kotlin和Conductor的意圖

MainController包含一個按鈕,當按下時會做一些黑盒子東西,設備會在通知托盤中收到通知。

當單擊該通知,我想要的行爲是彷彿

router.pushController(RouterTransaction.with(NotificationOpenController(bundle)) 
      .pushChangeHandler(VerticalChangeHandler()) 
      .popChangeHandler(VerticalChangeHandler())) 

就這樣發生了。

任何科特林相關的提示或修訂的讚賞,因爲我這樣做是爲了學習語言

我不確定如何以適當的方式,通過意圖實現這一點,也許廣播?但經過一些試驗和錯誤,現在我的代碼看起來是這樣的:

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    App.graph.inject(this) 
    setContentView(R.layout.activity_main_kotlin) 
    Log.d(TAG,"${FirebaseInstanceId.getInstance().getToken()}") 


    router = Conductor.attachRouter(this, controller_container, savedInstanceState) 

    val startingIntent : Intent? = intent 
    if(startingIntent?.extras != null){ 
     transitionToNotificationOpenController(startingIntent?.extras) 
    } 
    else{ 
     if (!router.hasRootController()) { 
      router.setRoot(RouterTransaction.with(MainController())); 
     } 
    } 
} 

override fun onBackPressed() { 
    if (!router.handleBack()) { 
     super.onBackPressed() 
    } 
} 

fun transitionToNotificationOpenController(bundl: Bundle?){ 
    router.pushController(RouterTransaction.with(NotificationOpenController(bundl)) 
      .pushChangeHandler(VerticalChangeHandler()) 
      .popChangeHandler(VerticalChangeHandler())) 
} 

通知目的是建立這樣

val builder = NotificationCompat.Builder(this).setContentTitle("Title").setContentText("Text") 
    val notificationIntent = Intent(this, MainActivity::class.java) 
    notificationIntent.putExtra("message",messageBody) 
    val contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 
      PendingIntent.FLAG_UPDATE_CURRENT) 
... 
manager.notify(1,builder.build()) 

但是,使用這種方法的動畫得到所有錯誤的,用戶只能請參閱「典型」 - 在加載一些或啓動新活動後彈出視圖 - ,因爲按下通知時有一個活動繼續,然後是按下後退按鈕後的活動暫停 - >活動恢復。

回答

1

達到預期效果。

<activity android:name=".ui.MainActivity" 
     android:launchMode="singleTop" 
     > 

MainActivity:

override fun onResume(){ 
    super.onResume() 
    val bundle : Bundle? = intent.extras 
    if (bundle != null){ 
     transitionToNotificationOpenController(bundle) 
    } 
} 

/** 
* MainActivity is defined in AndroidManifest.xml as android:launchMode="singleTop" 
* onNewIntent acts as an entrypoint whenever an intent is received pointing to MainActivity, 
* since we don't want to launch a new instance of the Activity. 
* (because we want to keep the stack of RouterTransactions) 
*/ 
override fun onNewIntent(intent : Intent){ 
    setIntent(intent) 
}