2

当用户启动我的应用程序时,我试图调用一个方法(无论是新启动,还是通过主页按钮隐藏后返回)

对于 iOS,我们可以将方法放在 " applicationDidBecomeActive" in 中AppDelegate.m,这样在应用启动时就会调用该方法。

但是,对于Android来说,如果我们把方法放在onResume()第一个activity中,不仅app启动会调用这个方法,从同一个app中的其他activity返回到第一个activity也会调用这个方法。我不希望发生这种情况,我只想在应用启动时调用该方法。

我过去曾问过它但在 Android 上似乎没有答案。

有什么解决办法吗?非常感谢。

4

5 回答 5

2

您可以实现自己的应用程序类。MyApplication extends Application并将其设置为清单文件中的应用程序AndroidManifest.xml

 <application 
  android:name="MyApplication" 
  . 
  . 
  .  >
  </application>

MyApplication类中,实现onCreate()onTerminate()方法。

onCreate()应用程序启动时调用的方法,在创建任何活动、服务或接收器对象(不包括内容提供者)之前。

请参阅应用程序的文档

于 2013-05-17T13:23:01.153 回答
0

您可以为所有活动定义一个超类并跟踪应用程序的状态。如果所有活动都处于停止状态 - 应用程序在后台,否则 - 在前台。在您的超级活动onStart()onStop()方法中,您可以增加和减少可见活动的数量。然后在 onStart() 检查是否有任何当前可见的活动。如果没有 - 应用程序变为活动状态,您可以调用您的方法:

public class SuperActivity extends Activity {
    private static int mVisibleActivitiesCount;

    @Override
    public void onStart(){
        super.onStart();
        if (mVisibleActivitiesCount == 0) {
            onAppBecomesActive();
        }
        mVisibleActivitiesCount++;
    }

    @Override
    public void onStop(){
        super.onStart();
        mVisibleActivitiesCount--;
    }

    private void onAppBecomesActive() {
        // Do some staff
    }
}
于 2013-05-17T13:35:28.790 回答
0

没有仅在应用程序从后台返回时调用的方法,但是您可以实现一些您可以实现类似这样的东西来查看应用程序是从后台启动还是首次启动。创建一个将由所有其他活动扩展的通用活动并覆盖 onStart():

public abstract class CustomActivity extends FragmentActivity {

public static int ACTIVITIES_RUNNING = 0;

    @Override
protected void onStart() {
    super.onStart();
    if (ACTIVITIES_RUNNING == 0) {
        //app came from background
        //start whatever you want
    }
    Const.ACTIVITIES_RUNNING++;
}

}

于 2013-05-17T13:38:00.333 回答
0

首先创建单例来计算前台的活动

public class ActivitiesCounter {

    public interface ApplicationLaunchListener{
        public void onLaunch();
    }

    private int mCounter = 0;

    private ApplicationLaunchListener mListener;

    private static ActivitiesCounter mInstance = new ActivitiesCounter();

    public static ActivitiesCounter getInstance(){
        return mInstance;
    }

    public void increase(){
        if(mCounter == 0){
            if(mListener != null){
                mListener.onLaunch();
            }
        }
        mCounter++;
    }

    public void decrease(){
        mCounter--;
    }

    public void setApplicationLaunchListener(ApplicationLaunchListener listener){
        mListener = listener;
    }

} 

然后活动:

public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ActivitiesCounter.getInstance().setApplicationLaunchListener(new ActivitiesCounter.ApplicationLaunchListener() {
            @Override
            public void onLaunch() {
                Toast.makeText(MyActivity.this, "launched", Toast.LENGTH_LONG).show();
            }
        });

        findViewById(R.id.btn_activity_b).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MyActivity.this, ActivityB.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        ActivitiesCounter.getInstance().increase();
    }

    @Override
    protected void onStop() {
        ActivitiesCounter.getInstance().decrease();
        super.onStop();
    }
}

活动B也应该增加和减少计数器

public class ActivityB extends Activity {

    @Override
    protected void onStart() {
        super.onStart();
        ActivitiesCounter.getInstance().increase();
    }

    @Override
    protected void onStop() {
        ActivitiesCounter.getInstance().decrease();
        super.onStop();
    }
}

最好为您的应用程序中的所有活动创建 BaseActivity(带有 onStart,onStop)(然后,您不需要每次都覆盖 onStart,onStop)

于 2013-05-17T13:39:07.367 回答
0

从 Manifests 文件夹中打开androidManifest.xml

选择应用启动时要打开的 Activity

将这些代码添加到该活动

 <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>

请记住从它已经存在的活动中删除此代码(通常是 MainActivity)

于 2019-01-30T12:09:49.627 回答