用户单击主页按钮时杀死活动

时间:2013-05-26 09:37:23

标签: java android android-activity

哦,这太奇怪了。 我有两个活动(好吧,两个以上,但没关系) - AppActivity和PopupActivity。 AppActivity是我的主要应用程序活动,它包含我的应用程序的设置。 PopupActivity是一个对话框,当用户单击通知中的按钮时它会被打开(这是一个RemoteViews通知)。嗯,它的工作原理。效果很好。但仅当用户通过单击后退按钮关闭AppActivity时。如果他们单击 home ,则在单击按钮几秒钟后会弹出PopupActivity。当用户使用主页按钮关闭PopupActivity时,会发生同样的事情。单击通知中的按钮不会立即打开PopupActivity,但需要几秒钟才能终止仍然存在于后台某处的上一个活动。

我尝试在onStop和onPause方法中调用finish(),但它不能解决我的问题。

编辑:以下是我的代码:

清单:

    <activity
        android:name="cc.lupine.quicksocial.AppActivity"
        android:label="@string/app_name"
        android:configChanges="orientation|screenSize" android:noHistory="true" android:clearTaskOnLaunch="true" android:finishOnTaskLaunch="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity 
        android:configChanges="orientation|screenSize" 
        android:excludeFromRecents="true" 
        android:showOnLockScreen="false" 
        android:theme="@android:style/Theme.Holo.Light.Dialog.NoActionBar.MinWidth" 
        android:name="cc.lupine.quicksocial.PopupActivity" 
        android:noHistory="true"
        android:launchMode="singleInstance"
        android:taskAffinity="" 
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
    <service android:name="cc.lupine.quicksocial.ShareService"></service>

ShareService.java(只是当用户点击通知中的按钮时调用的函数):

public static void startSharing(Context ctx, int n) {
    Log.d("sn", "startsharing called in shareservice");
    if(n == 1 || n == 2)
    {
        Intent i = new Intent(ThisApplication.getAppContext(), PopupActivity.class);
        i.putExtra("shareType", n);
        i.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY|
                  Intent.FLAG_ACTIVITY_CLEAR_TOP|
                  Intent.FLAG_ACTIVITY_SINGLE_TOP|
                  Intent.FLAG_ACTIVITY_CLEAR_TASK|
                  Intent.FLAG_FROM_BACKGROUND|
                  Intent.FLAG_ACTIVITY_NEW_TASK);
        ctx.startActivity(i);
    } else if(n == 3) {
        // doesn't matter for now
    }
}

PopupActivity.java(片段):

public class PopupActivity extends Activity implements OnDataPass {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d("sn", "oncreate called in popupactivity");
        super.onCreate(savedInstanceState);
        instanceOfPopupActivity = this;
        setContentView(R.layout.activity_popup);

        ShareFragment sfrag = new ShareFragment();
        Bundle args = new Bundle();
        Bundle extras = getIntent().getExtras();
        try {
            //doesn't matter
        } catch(Exception e) { e.printStackTrace(); finish(); }
        sfrag.setArguments(args);
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.contFragment, sfrag);
        fragmentTransaction.commit(); 

    }
    @Override
    public void onPause()
    {
        Log.d("sn", "onpause called in popupactivity");
        finish();
        super.onPause();
    }
    @Override
    public void onStop() {
        Log.d("sn", "onstop called in popupactivity");
        super.onStop();
    } 
    @Override
    public void onDestroy() 
    {
        Log.d("sn", "ondestroy called in popupactivity");
        super.onDestroy();
    }

}

如果我是第一次打开弹出窗口:

05-26 14:37:14.149: D/sn(7218): startsharing called in shareservice
05-26 14:37:14.179: D/sn(7218): oncreate called in popupactivity

但是当我用主页按钮关闭弹出窗口并尝试再次打开它时:

05-26 14:38:11.620: D/sn(7218): startsharing called in shareservice
05-26 14:38:14.103: D/sn(7218): oncreate called in popupactivity

onCreate需要花费大量时间才能被调用。现在,原因是什么?

2 个答案:

答案 0 :(得分:1)

我认为你专注于错误的问题(杀死活动),而不是专注于真正的问题(10秒再次启动它)。

首先,您需要了解为什么如果您使用主页键退出其他活动,则需要10秒才能打开它!

如果您发布了更多详细信息(包含源代码),那么您将更容易理解并帮助您!

答案 1 :(得分:0)

当您想要关闭应用时调用finish()。在两个活动上调用finish()并注意弹出窗口必须可以集中处理点击。