android Activity关闭后 onDestory不执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android Activity关闭后 onDestory不执行相关的知识,希望对你有一定的参考价值。

android Activity关闭后 onDestory不执行,项目是cocos2dx 开发的Activity只有一个,游戏关闭后并没有去执行onDestory,可能在某些机型上,关闭游戏后在打开就黑屏了

调用Activity的finish()方法关闭Activity才会执行onDestory,如果是startActivity,并不会执行onDestory,而会执行onStop()。

以下是Activity的生命周期:

    启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。

    当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。

    当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。

    当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。

    用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

    当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。

    用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

参考技术A 可以做个测试,Cocosdx关闭其实是调用的activiity的finish,打个断点看看activity究竟有没有调用finish。本回答被提问者采纳

Android12.2 利用Intent启动和关闭Activity

分类:C#、Android、VS2015;

创建日期:2016-02-23

一、简介

Android应用程序中一般都有多个Activity,在Activity中,通过调用StartActivity方法,并在该方法的参数中传递Intent对象,就可以实现不同Activity之间的切换和数据传递。

通过StartActivity方法传递intent对象来启动另一个Activity时,可分为两类:

l 显式启动:在创建的Intent对象中明确指定启动的是哪个Activity;

l 隐式启动:安卓系统根据Intent的动作和数据决定应该启动哪个Activity。

1、显式启动Activity

通过Intent显式启动一个Activity时,必须先创建一个Intent对象,并在该对象的构造函数中指明要启动的目标组件名。例如:

var intent = new Intent(this, typeof(Activity1));

StartActivity(intent);

在这种情况下,除了intent对象以外,没有其他方式可以匹配组件名。

2、隐式启动Activity

隐式启动Activity是指Android系统根据过滤规则自动去匹配对应的Intent,即不需要在Intent对象中明确指明启动的是哪个Activity,而是让Android系统来决定应该启动谁。在这种情况下,Android系统会自动匹配最适合处理intent的一个或多个Activity。匹配的Activity可能是应用程序自身的,也可能是Android系统内置的,还可能是第3方应用程序提供的。因此,隐式启动这种方式更强调了Android应用程序中组件的复用性。

注意,如果希望让你的程序通过Activity展示某些动作,例如打电话、发邮件、发短信,或者使用activity中的数据等。这时候,首先考虑调用系统提供的功能去实现(即:隐式启动Activity的方式)。在这种情况下,只需要通过Intent指定相应的动作即可,这是intent真正体现其价值的地方。例如:

var call = new Intent(Intent.ActionCall); //初始化一个电话呼叫

call.SetData(Android.Net.Uri.Parse("tel:13811112222"));

StartActivity(call);

下面是常用的一些动作常量:

技术分享

注意:用C#表示这些动作常量时,键入“Intent.”然后选择一个常量即可。这些可选择的常量去掉了分隔单词的下划线,并将每个单词的首字母改为大写,其他字母改为小写,例如:Intent.ActionCall。

除了指定相应的动作以外,还可以同时指定Uri,这种情况下,Android会调用内置的浏览器来隐式启动一个Activity。例如:

Intent intent=new Intent(Intent.ActionView, Uri.Parse("http://www.google.com");

StartActivity(intent);

3、关闭Activity

调用Finish()可终止activity。也可以调用FinishActivity() 来终止你之前启动了的一个独立的activity。

记住:显式关闭Activity仅用于你绝对不想让用户再返回这个activity的实例的情况。多数情况下,都不应该显式调用Finish()或者FinishActivity()来关闭acitivity,而是应该让系统为你去管理它。

二、示例—ch1201IntentDemo

该例子演示如何通过Intent拨打电话,以及如何启动另一个Activity。

本例子需要应用程序具有“CALL_PHONE”权限。

1、运行截图

运行前先在模拟器中添加一些联系人及其电话号码(模拟器本身有这个功能,直接在模拟器中操作即可),然后再测试要拨出的号码。

下面左图是该例子的主界面,右图是单击【打电话】按钮后,在第2个界面中拨出的电话号码截图。

技术分享  技术分享

下图是单击【转到活动1】按钮后的运行截图。

技术分享

2、主要设计步骤

(1)添加“CALL_PHONE”权限

在【解决方案资源管理器】中,鼠标双击项目的【Properties】进入下面的界面,然后勾选“CALL_PHONE”选项:

技术分享

设置后,系统就会自动在AndroidManifest.xml中添加下面的代码:

<uses-permission android:name="android.permission.CALL_PHONE" />

(2)添加ch1201_Main.axml

在Resources\\layout文件夹下添加该文件,模板选择【Layout】:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:id="@+id/btn1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="打电话" />
    <Button
        android:id="@+id/btn2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="转到活动1" />
</LinearLayout>

(3)添加ch1201_Layout1.axml

在Resources\\layout文件夹下添加该文件,模板选择【Layout】:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:text="这是活动1的界面\\n\\n提示:按【Back】按钮返回"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView1"
        android:layout_gravity="center"
        android:layout_margin="30dp" />
</LinearLayout>

(4)添加ch1201IntentDemoMain.cs

在SrcDemos文件夹下添加该文件,模板选择【Activity】:

using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget;

namespace MyDemos.SrcDemos
{
    [Activity(Label = "【例12-1】Intent基本用法1")]
    public class ch1201IntentDemoMain : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.ch1201_Main);

            //启动电话拨号的Activity
            FindViewById<Button>(Resource.Id.btn1).Click += delegate
            {
                var call = new Intent(Intent.ActionCall);
                call.SetData(Android.Net.Uri.Parse("tel:13811112222"));
                StartActivity(call);
            };

            //启动自定义的Activity
            FindViewById<Button>(Resource.Id.btn2).Click += delegate
            {
                var intent = new Intent(this, typeof(ch1201IntentDemoActivity1));
                StartActivity(intent);
            };
        }
    }
}

(5)添加ch1201IntentDemoActivity1.cs

在SrcDemos文件夹下添加该文件,模板选择【Activity】:

using Android.App;
using Android.OS;

namespace MyDemos.SrcDemos
{
    [Activity(Label = "【例12-1】Intent基本用法1")]
    public class ch1201IntentDemoActivity1 : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.ch1201_Layout1);
        }
    }
}

运行。

以上是关于android Activity关闭后 onDestory不执行的主要内容,如果未能解决你的问题,请参考以下文章

关闭飞行模式后,为啥 Android 应用程序会通过 Activity 和 Fragment 生命周期方法

android Activity改成dialog样式后 怎么设置点击空白处关闭窗体,如图点击窗体意外的地方关闭窗体

Android 隐藏最近任务栏,使Activity 不在最近任务栏显示

Android开发中关闭service的问题

android 怎么调用强制关闭

android如何finish应用程序通过startActivityForResult打开的activity