如何在应用启动期间触发方法? (机器人)

时间:2013-05-17 13:11:32

标签: android iphone launch onresume appdelegate

我正试图在用户启动我的应用程序时调用一个方法(无论是新发布,还是在被家庭按钮隐藏后返回它)

对于iOS,我们可以将该方法放在applicationDidBecomeActive中的“AppDelegate.m”中,以便在应用启动时调用该方法。

但是,对于Android,如果我们将方法放在onResume()中的第一个活动中,不仅应用程序启动会调用该方法,从同一应用程序中的其他活动支持第一个活动也将调用方法。我不希望发生这种情况,我只想在app启动时调用该方法。

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

任何解决方案?非常感谢。

5 个答案:

答案 0 :(得分:2)

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

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

MyApplication班级中,实施onCreate()onTerminate()方法。

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

onCreate()方法。

请参阅docs申请。

答案 1 :(得分: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
    }
}

答案 2 :(得分: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++;
}

}

答案 3 :(得分: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)

答案 4 :(得分:0)

从清单文件夹中打开 androidManifest.xml

选择要在应用启动时打开的活动

将这些代码添加到该活动

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

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

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