簡體   English   中英

Android:如何將回調傳遞給活動?

[英]Android: How do you pass a callback to an activity?

我正在創建一個庫。 它會創建一個活動,啟動它,並在按下按鈕后完成它。

按下按鈕后,我想通過一個接口執行一些客戶端代碼。

也就是說,這個庫的用戶傳入一個實現,我只是執行它。

類似的iOS代碼將是:

MyViewController *vc = [[MyViewController alloc] init];
vc.callOnComplete = ...
[self presentViewController:vc animated:YES completion:nil];

所需的代碼是:

public interface SaveStuff {
    void save();
}

在我的圖書館的活動中:

private SaveStuff saveStuff;
public void onButtonClicked(View v) {
    saveStuff.save() // client passes in saveStuff obj
    finish();
}

我嘗試過序列化。 我創建了一個實現接口的類,並且還實現了Serializable ,並嘗試將其傳遞並使用getSerializableExtra將其getSerializableExtra 我最終獲得了一個非序列化的異常。 據我所知,這可能不是一個可行的解決方案,因為它意味着客戶端必須在其實現中僅使用可序列化的類。 如果我錯了,請糾正我。 在我的試驗中,客戶端活動顯示在非序列化異常中。

我嘗試過使用靜態引用。 基本上是全球州/單身人士。 事實證明,根據諸如此類的各種答案: Java靜態變量變為空 ,我不能依賴任何靜態狀態,並且任何與靜態一起工作的解決方案只是巧合。

我沒有嘗試使用startActivityForResult簡單地啟動活動,因為這需要我將我們接受的上下文作為參數投射到Activity。 該活動開始這個庫里面

private void startNewActivity(int newVersion) {
    Intent i = new Intent(context, MyActivity.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    context.startActivity(i); // context variable is passed in by the client
}

如您所見,客戶端傳遞上下文。 我可以將上下文startActivityForResult為一個Activity來調用startActivityForResult ,但是我不想這樣做,因為我已經讀過並不總是安全的。 我可以要求傳入一個Activity 。這可能是一個合理的要求,但我不想去那里。

我看過現有的問題,而我沒有嘗試的是使用廣播。 如果我錯誤地想到這一點,請糾正我,但我能做的最好的事情是將對客戶端接口實現的引用保持為廣播接收器,然后在我創建的活動中發送廣播。 但是我擔心接收器不會持續存在。 如果我的庫向用戶顯示活動,但用戶在按下按鈕之前殺死了應用程序,會發生什么? 客戶端代碼的引用由上一個活動保存。 按下按鈕什么都不會發生?

我應該只是廣播一條消息,並將其留給客戶處理這些案件嗎? 客戶如何處理這個? 在app啟動/關閉時注冊一些東西? 我是否必須強制用戶執行此操作才能使用我的庫? 這合理嗎?

更新:

事實證明,我們只是讓庫中的活動訪問單例。 為了避免基於被殺死的活動等被擦除狀態的所有問題,該庫的用戶將被要求在單例上運行'setup'方法,並在那里傳遞回調obj。 他們將在某種基礎Activity的onResume上運行它。 在回答這個問題的自我回答之前,我會稍等一下,看看是否還有其他選擇。

你為什么不為android使用相同的過程,即1)創建一個接口2)在你的活動中聲明一個接口的公共變量。 3)用戶將在開始啟動您的活動時初始化該界面。 4)使用接口變量來調用方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM