如何在应用启动期间触发方法? (安卓)

Posted

技术标签:

【中文标题】如何在应用启动期间触发方法? (安卓)【英文标题】:How to trigger a method during app launch? (Android) 【发布时间】:2013-05-17 13:11:31 【问题描述】:

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

对于ios,我们可以将方法放在AppDelegate.m中的“applicationDidBecomeActive”中,这样​​应用启动时就会调用该方法。

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

我已经问过它in the past,但在 Android 上似乎没有答案。

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

【问题讨论】:

那么您不应该接受部分答案。或者您需要针对 ios 和 android 提出两个不同的问题。 【参考方案1】:

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

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

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

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

申请见docs。

【讨论】:

如果应用从后台恢复(不是系统重新创建的),应用的onCreate方法将不会被调用。 我试过这种方法,但似乎有一些限制。由于该类扩展了“Application”,因此我的方法不再起作用,因为它需要该类扩展“Activity”【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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)

【讨论】:

【参考方案4】:

您可以为所有活动定义一个超类并跟踪应用程序的状态。如果所有活动都处于停止状态 - 应用程序在后台,否则 - 在前台。在您的超级活动的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
    

【讨论】:

【参考方案5】:

从 Manifests 文件夹中打开 androidManifest.xml

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

将这些代码添加到该活动中

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

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

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

【讨论】:

以上是关于如何在应用启动期间触发方法? (安卓)的主要内容,如果未能解决你的问题,请参考以下文章

在应用启动期间获取当前位置

安卓应用如何在整个应用运行期间都禁止弹出输入法面板?

如何在 iOS 7 启动期间更改状态栏样式

如何在不同的安卓手机上同时启动一个任务?

如何在应用启动期间获取位置

如何在spring boot启动期间关闭应用程序