让我们说我有一个主动控制我的应用程序的流量。在这个活动中,我有一些偶尔会更新的数据列表。
mainactivity根据用户输入启动其他活动。
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (id == 0) {
openLogin();
}
if ( id == 1) {
Intent intent = new Intent(getApplicationContext(), MyGame.class);
intent.putExtra("game", getGame());
intent.putExtra("bonus", getBonusFields());
startActivityForResult(intent, 0);
}
if ( id == 2) {
scoreboardIntent = new Intent(getApplicationContext(), ScoreBoard.class);
Bundle scoreboardBundle = new Bundle();
scoreboardBundle.putSerializable("players", scores);
scoreboardIntent.putExtra("players", scoreboardBundle);
scoreboardOpen = true;
startActivityForResult(scoreboardIntent, 0);
}
}
我想要做的是不是用ScoreBoard.Class启动一个Intent,我想通过引用ScoreBoard对象来启动它,这样就可以做到这样的事情:
ScoreBoard scoreboard = new ScoreBoard();
startActivityForResult(scoreboardIntent, 0);
//then if my datalistener triggers
scoreboard.updateStuff();
我知道我可以将监听器移动到Scoreboard类,但我想知道是否可以这样做。
任何见解都将受到赞赏。
编辑:按照CommonsWare的比喻,活动将是单独的页面。目前有三个活动,虽然它们都是独立的,但它们中的两个需要访问同一个DB。 1.主菜单这是一个列表视图,包含(以及其他内容)开始新游戏或查看排行榜的选项。 2.比赛。除了来自mainmenus startActivityForResult()的回调之外,此Activity不与其他任何内容交互;游戏结束后,分数返回并需要存储在DB的某个地方。 3.排行榜。此活动显示列表中的最高分。所以这就是我的困境:如果我将数据库监听器放在mainmenu中,我将能够将Game回调存储到DB中,并且我将能够通过bundle或intentextras传递列表来触发排行榜。但是,当我的监听器对数据库中的更改做出反应时,我将无法更新排行榜。如果我将DB监听器放在排行榜中,我将能够立即显示基础数据的变化,但是如果不在主菜单中添加DB对象,我将无法保存新游戏的分数。(除非我遗漏了什么)< / p>
我认为最好的解决方案是让mainmenu可以访问数据库,并将排行榜变成一个片段列表,当活动显示在主菜单之上时。任何有关我失踪的解决方案或解释的建议都会受到高度赞赏,因为我对活动沟通方式的理解似乎有点瑕疵。
答案 0 :(得分:2)
但我想知道是否有可能这样做
不,有两个原因:
您无法通过构造函数
没有Intent
机制可以将Activity
传递给另一个Activity
如果这些活动紧密结合,也许它们根本不应该是单独的活动,而应该是一个单独的活动。
举一个类比:如果这是一个Web应用程序,这个功能是属于两个单独的网页,还是一个页面?如果是后者,请使用一项活动。如果是前者,则使用两个活动......但是,您需要处理这些活动之间的分离,就像您需要处理Web应用程序中Web页面之间的分离一样。