我编写了一个简单的应用程序,其中有一个“关于”屏幕(活动),当用户从主要活动中选择“选项菜单”中的“关于”项时,会显示该屏幕。 “关于”屏幕上有一个名为“关闭”的按钮。
我想要的行为是,当用户点击“关闭”按钮时,她/他应该被带到之前的活动(即启动关于活动的活动)。为此,我使用startActivityForResult();
从主活动(TFT)启动关于活动(TFTAbout),然后在TFTAbout.java
中调用setResult()
和finish()
,然后调用onActivityResult()
单击“关闭”时主要活动中的{1}}。
实际发生的是,当我点击“关闭”时,不会调用主要活动(TFT)。
从日志中可以看出活动TFTAbout确实执行了setResult()
和finish()
。但是,在这一点上,将为主活动调用onDestroy。因此,我的猜测是,由于没有要返回的启动活动,因此未调用onActivityResult()
。
我对吗?
请参考下面的Logcat输出(没有时间戳以获得更好的可读性):
DEBUG/TFT(816): onOptionsItemSelected: 'About' item selected.
INFO/ActivityManager(563): Starting activity: Intent { action=android.intent.action.GET_CONTENT type=text/plain comp={com.wirel.tft/com.wirel.tft.TFTAbout} }
DEBUG/TFTAbout(816): onCreate: START
DEBUG/TFTAbout(816): onCreate: END
INFO/ActivityManager(563): Displayed activity com.wirel.tft/.TFTAbout: 3880 ms
DEBUG/TFT(816): onDestroy: BEGIN
DEBUG/TFT(816): onDestroy: END
DEBUG/dalvikvm(606): GC freed 672 objects / 36656 bytes in 90ms
DEBUG/TFTAbout(816): onClick: 'Close' button pressed... Returning to calling activity.
WARN/ActivityManager(563): Activity pause timeout for HistoryRecord{4370efe0 {com.wirel.tft/com.wirel.tft.TFTAbout}}
WARN/ActivityManager(563): Activity destroy timeout for HistoryRecord{4370efe0 {com.wirel.tft/com.wirel.tft.TFTAbout}}
DEBUG/TFTAbout(816): onClick: Activity is finishing? true
发布活动代码(TFT):
@Override
public boolean onOptionsItemSelected( MenuItem mi )
{
int item_id = mi.getItemId();
switch ( item_id )
{
case R.id.mi_about:
{
Log.d( LOG_TAG, "onOptionsItemSelected: 'About' selected." );
/* Start the activity to display the About page. */
Intent i = new Intent( Intent.ACTION_GET_CONTENT,
TFTMetadata.ABOUT_TEXT_URI );
i.setType( "text/plain" );
startActivityForResult( i, 0 );
break;
}
....
}
@Override
protected void onActivityResult
( int request_code, int result_code, Intent i )
{
Log.d( LOG_TAG, "onActivityResult: START." );
super.onActivityResult( request_code, result_code, i );
/* Use the request code to select between multiple child activities we may have started. Here there is only one thing we launch. */
if ( request_code == Activity.RESULT_FIRST_USER )
{
Log.d( LOG_TAG, "onActivityResult: 'About' activity has returned." );
}
}
已启动活动的代码(TFTAbout):
@Override
public void onCreate( Bundle savedInstanceState )
{
Log.d( LOG_TAG, "onCreate: START" );
super.onCreate( savedInstanceState );
/* Set what to do when the user presses a key but the key press is
not handled by the application. */
setDefaultKeyMode( DEFAULT_KEYS_DISABLE );
/* Connect the appropriate resource to this activity. */
setContentView( R.layout.about );
/* Define the click listener for the Close button. */
Button b = (Button) findViewById( R.id.bt_close );
b.setOnClickListener( this );
}
public void onClick(View v)
{
Log.d( LOG_TAG, "onClick: 'Close' button pressed... Returning to calling activity." );
setResult( RESULT_OK, (new Intent()).setAction("About activity has finished!") );
finish();
ComponentName cn = this.getCallingActivity();
if ( cn != null )
{
Log.d( LOG_TAG, "onClick: calling activity = " + cn.getClassName() );
}
Log.d( LOG_TAG, "onClick: Activity is finishing? " + String.valueOf( this.isFinishing() ) );
return;
}
有人可以向我解释为什么我的主要活动可能会被破坏,以及我所做的是否正确?
答案 0 :(得分:0)
我也有同样的问题。在我的例子中,我通过更改AndroidManifest.xml文件中的一行来解决这个问题。
请参阅MainActivity does not receive result from StartActivityForResult
我希望这能解决你的问题。