gpt4 book ai didi

android - Android 服务和 Activity 之间的通信

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:47 25 4
gpt4 key购买 nike

see architecture

我想开发一个包含三个 Activity 和两个服务的 Android 应用。

第一个名为 WebClientService 的服务使用处理程序每​​ 30 秒调用一次 REST API,并且必须将结果通知 Activity Activity 。它还必须通知名为 DatabaseService 的第二个服务,以更新本地数据库。

数据库服务只会在 Activity 的 onCreate 时调用一次(以防应用程序崩溃和重启),并且只会在 onRestart 时调用一次(这样我们就有了数据以防出现连接问题)。然后,由于 WebClientService 每 30 秒通知一次“Activity ” Activity , Activity 将自行更新。

问题是:

  • 通知 Activity Activity 和后台数据库服务更新的最佳方式是什么?我的想法是在 WebClientService 和 BroadcastReceiver 中使用 sendBroadcast() 在每个 Activity 和 DatabaseService 中,这是正确的方法吗?

  • 我应该对 AllMeetingRoomActivity 和 DatabaseService 之间的通信使用相同的方法还是应该使用 Bound Service ?

谢谢

更新:DatabaseService 将不再是后台服务,而只是 WebClientService 和 Activity 之间的数据库层的共享实例。

所以现在的问题是:将我的 30 秒更新写入本地数据库并允许 Activity 每隔几秒更新一次,只需从本地数据库读取是否是一个好方法?这会不会对性能产生太大影响?

上下文:

遵循我目前已实现的内容,但使用 SettableFutures,因此一旦我弄清楚如何使它们有效通信,就需要使用 Services 和 Broadcasts 重新实现:

public class MainActivity extends AppCompatActivity {               

private TextView meetingsTextView;
private EditText mEdit, editSubject;

private final ConnectorInitializer clientInitializer = new ConnectorInitializer();
private AppConnector genericClient; // can use OutlookClient or a test client to talk with a mock server

@Override
protected void onCreate(Bundle savedInstanceState) {

// initializes client based on the settings in "config.json"
genericClient = clientInitializer.create(this);

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

meetingsTextView = (TextView) findViewById(R.id.NowMeeting);
mEdit = (EditText)findViewById(R.id.editText);
editSubject = (EditText)findViewById(R.id.editSubject);

Futures.addCallback(genericClient.logon(this, scopes), new FutureCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
Log.d("APP", "-- Logged in. --");

databaseConnector.synchronouslyGetBackupFromLocalDatabase() // FUTURE
// callback here
// onSuccess, onFailure

}

@Override
public void onFailure(@NonNull Throwable t) {
Log.e("\n ~~~~>> logon \n", t.getMessage());
meetingsTextView.setText(R.string.Login_Failed);
}
});

}

/** At the moment the UI is not updated automatically every 30 seconds
* but manually using a refresh button
*/
public void getBookings(@SuppressWarnings("UnusedParameters") View view){

Log.d("APP", "Retrieve button clicked: "+(DateTime.now())+". Calling async getCalendar.");
meetingsTextView.setText(R.string.retrieving_events);

try{
Futures.addCallback( genericClient.getCalendarEvents(), new FutureCallback<String>(){
@Override
public void onSuccess(final String resultCalendars) {

Log.d("APP", "Success. Result: "+resultCalendars);

runOnUiThread(new Runnable() {
@Override
public void run() {

Log.d("APP", "Calendars SUCCESSFULLY retrieved.");
String meetingsRetrieved = getString(R.string.calendar)+resultCalendars;
meetingsTextView.setText(meetingsRetrieved);

Toast.makeText(getApplicationContext(), "Success!", Toast.LENGTH_LONG).show();
}
});

databaseConnector.asyncUpdateLocalDbWithResults(); // FUTURE
// callback here
// onSuccess, onFailure

}

@Override
public void onFailure(@NonNull Throwable t) {
Log.e( "APP", "Calendar error. Cause: "+t.getLocalizedMessage() );
String retrieveError = "Retrieve error. \n\n\n"+t.getLocalizedMessage();
meetingsTextView.setText(retrieveError);
Toast.makeText(getApplicationContext(), "Fail!", Toast.LENGTH_LONG).show();
}
});

}catch(Exception ex){
Log.e("APP","Something went wrong in your code. Cause:"+ex);
}
}

最佳答案

最佳选择:

使用LocalBroadcastManager。更多引用here .

我的服务.java:

private LocalBroadcastManager localBroadcastManager;
private final String SERVICE_RESULT = "com.service.result";
private final String SERVICE_MESSAGE = "com.service.message";

@Override
public void onCreate() {
super.onCreate();

// Other stuff

localBroadcastManager = LocalBroadcastManager.getInstance(this);
}

在服务中添加以下方法,每当您想要将数据从服务更新到 Activity 时,通过传递 Arguments 来调用方法。

private void sendResult(String message) {
Intent intent = new Intent(SERVICE_RESULT);
if(message != null)
intent.putExtra(SERVICE_MESSAGE, message);
localBroadcastManager.sendBroadcast(intent);
}

HomeActivity.java:

private BroadcastReceiver broadcastReceiver;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_home);
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String s = intent.getStringExtra(MyService.SERVICE_MESSAGE);
// do something here.
}
};
}

@Override
protected void onStart() {
super.onStart();
LocalBroadcastManager.getInstance(this).registerReceiver((broadcastReceiver),
new IntentFilter(MyService.SERVICE_RESULT));
}

@Override
protected void onStop() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);
super.onStop();
}

希望对您有所帮助。

关于android - Android 服务和 Activity 之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36525508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com