我正试图在用户启动我的应用程序时调用一个方法(无论是新发布,还是在被家庭按钮隐藏后返回它)
对于iOS,我们可以将该方法放在applicationDidBecomeActive
中的“AppDelegate.m
”中,以便在应用启动时调用该方法。
但是,对于Android,如果我们将方法放在onResume()
中的第一个活动中,不仅应用程序启动会调用该方法,从同一应用程序中的其他活动支持第一个活动也将调用方法。我不希望发生这种情况,我只想在app启动时调用该方法。
我已经问过in the past,但在Android上似乎没有答案。
任何解决方案?非常感谢。
答案 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)中删除此代码