每当我的广播执行时,我想显示对前景活动的警报。
当前回答
我迟到了3年,但我还是会接的,以防有人像我一样发现这个。
我解决这个问题的方法很简单:
if (getIntent().toString().contains("MainActivity")) {
// Do stuff if the current activity is MainActivity
}
注意"getIntent(). tostring()"包含了一堆其他文本,比如你的包名和你的活动的任何意图过滤器。从技术上讲,我们检查的是当前的意图,而不是活动,但结果是一样的。就用Log吧。d(“测试”,getIntent () .toString ());如果你想看所有的文字。这个解决方案有点俗气,但它在你的代码中要干净得多,功能是相同的。
其他回答
其他答案我都不喜欢。ActivityManager不是用来获取当前活动的。超级分类和依赖onDestroy也是脆弱的,不是最好的设计。
老实说,到目前为止,我所想到的最好的方法就是在我的应用程序中维护一个枚举,它在创建活动时得到设置。
另一个建议可能是尽量避免使用多个活动。这既可以使用片段,也可以在我喜欢的自定义视图中完成。
我在@gezdy的答案上方展开。
在每个活动中,我们可以使用下面的API,而不是通过手动编码将自己“注册”到应用程序中,这是第14级以来的API,可以帮助我们用更少的手动编码实现类似的目的。
public void registerActivityLifecycleCallbacks (Application.ActivityLifecycleCallbacks callback)
http://developer.android.com/reference/android/app/Application.html#registerActivityLifecycleCallbacks%28android.app.Application.ActivityLifecycleCallbacks%29
在应用程序中。ActivityLifecycleCallbacks,您可以得到哪个活动“附加”到或“分离”到这个应用程序。
但是,这种技术只在API级别14之后才可用。
就我个人而言,我是按照“Cheok Yan Cheng”说的去做的,但我使用了一个“列表”来对我所有的活动进行“备份”。
如果你想检查哪个是当前活动,你只需要得到列表中的最后一个活动类。
创建一个扩展“application”的应用程序,这样做:
public class MyApplication extends Application implements Application.ActivityLifecycleCallbacks,
EndSyncReceiver.IEndSyncCallback {
private List<Class> mActivitiesBackStack;
private EndSyncReceiver mReceiver;
private Merlin mMerlin;
private boolean isMerlinBound;
private boolean isReceiverRegistered;
@Override
public void onCreate() {
super.onCreate();
[....]
RealmHelper.initInstance();
initMyMerlin();
bindMerlin();
initEndSyncReceiver();
mActivitiesBackStack = new ArrayList<>();
}
/* START Override ActivityLifecycleCallbacks Methods */
@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
mActivitiesBackStack.add(activity.getClass());
}
@Override
public void onActivityStarted(Activity activity) {
if(!isMerlinBound){
bindMerlin();
}
if(!isReceiverRegistered){
registerEndSyncReceiver();
}
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
if(!AppUtils.isAppOnForeground(this)){
if(isMerlinBound) {
unbindMerlin();
}
if(isReceiverRegistered){
unregisterReceiver(mReceiver);
}
if(RealmHelper.getInstance() != null){
RealmHelper.getInstance().close();
RealmHelper.getInstance().logRealmInstanceCount("AppInBackground");
RealmHelper.setMyInstance(null);
}
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}
@Override
public void onActivityDestroyed(Activity activity) {
if(mActivitiesBackStack.contains(activity.getClass())){
mActivitiesBackStack.remove(activity.getClass());
}
}
/* END Override ActivityLifecycleCallbacks Methods */
/* START Override IEndSyncCallback Methods */
@Override
public void onEndSync(Intent intent) {
Constants.SyncType syncType = null;
if(intent.hasExtra(Constants.INTENT_DATA_SYNC_TYPE)){
syncType = (Constants.SyncType) intent.getSerializableExtra(Constants.INTENT_DATA_SYNC_TYPE);
}
if(syncType != null){
checkSyncType(syncType);
}
}
/* END IEndSyncCallback Methods */
private void checkSyncType(Constants.SyncType){
[...]
if( mActivitiesBackStack.contains(ActivityClass.class) ){
doOperation() }
}
}
在我的例子中,我使用了“应用程序”。ActivityLifecycleCallbacks”:
Bind/Unbind Merlin Instance (used to get event when the app lose or get connection, for example when you close mobile data or when you open it). It is useful after the "OnConnectivityChanged" intent action was disabled. For more info about MERLIN see: MERLIN INFO LINK Close my last Realm Instance when the application is closed; I will init it inside a BaseActivity wich is extended from all others activities and which has a private RealmHelper Instance. For more info about REALM see: REALM INFO LINK For instance I have a static "RealmHelper" instance inside my "RealmHelper" class which is instantiated inside my application "onCreate". I have a synchronization service in which I create I new "RealmHelper" because Realm is "Thread-Linked" and a Realm Instance can't work inside a different Thread. So in order to follow Realm Documentation "You Need To Close All Opened Realm Instances to avoid System Resources Leaks", to accomplish this thing I used the "Application.ActivityLifecycleCallbacks" as you can see up. Finally I have a receiver wich is triggered when I finish to synchronize my application, then when the sync end it will call the "IEndSyncCallback" "onEndSync" method in which I look if I have a specific Activity Class inside my ActivitiesBackStack List because I need to update the data on the view if the sync updated them and I could need to do others operations after the app sync.
以上就是全部内容,希望对大家有所帮助。见u:)
通过使用这部分代码,您可以检测应用程序何时进入后台/前台,并访问当前活动名称和上下文。
我的答案是基于这篇文章:Android:如何检测App进入后台/前台
首先,创建一个扩展android.app.Application并实现ActivityLifecycleCallbacks接口的类。在Application.onCreate()中,注册回调。
public class App extends Application implements ActivityLifecycleCallbacks
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
在Manifest中注册“App”类,如下所示:
<application
android:name=".App"
这就是ActivityLifecycleCallbacks接口的样子,
public interface ActivityLifecycleCallbacks {
void onActivityCreated(Activity activity, Bundle savedInstanceState);
void onActivityStarted(Activity activity);
void onActivityResumed(Activity activity);
void onActivityPaused(Activity activity);
void onActivityStopped(Activity activity);
void onActivitySaveInstanceState(Activity activity, Bundle outState);
void onActivityDestroyed(Activity activity);
}
因此,当您的任何活动(您创建或包含在库中的活动)通过上述任何生命周期方法时,这些回调将被调用。 当应用程序在前台时,至少有一个Activity处于启动状态,当应用程序在后台时,将没有Activity处于启动状态。 在“App”类中声明如下2个变量。
private int activityReferences = 0;
private boolean isActivityChangingConfigurations = false;
activityReferences将保存处于启动状态的activity的数量。isActivityChangingConfigurations是一个标志,用于指示当前Activity是否正在经历配置更改,如方向切换。 使用下面的代码,你可以检测应用程序是否出现在前台。
@Override
public void onActivityStarted(Activity activity) {
if (++activityReferences == 1 && !isActivityChangingConfigurations) {
// App enters foreground
}
}
你可以在这个方法中像这样访问context:
activity.getBaseContext()
这是如何检测应用程序是否进入后台。
Override
public void onActivityStopped(Activity activity) {
isActivityChangingConfigurations = activity.isChangingConfigurations();
if (--activityReferences == 0 && !isActivityChangingConfigurations) {
// App enters background
}
}
现在您可以访问当前的前台活动名称和上下文。
如果您正在使用kotlin,那么它可以帮助您获得当前活动名称。 然而,getRecentTasks()方法在Java中已弃用。
val am: ActivityManager = applicationContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val activityName: String = am.getRecentTasks(1, 0).get(0).topActivity.toString()
推荐文章
- 警告:API ' variable . getjavacompile()'已过时,已被' variable . getjavacompileprovider()'取代
- 安装APK时出现错误
- 碎片中的onCreateOptionsMenu
- TextView粗体通过XML文件?
- 如何使线性布局的孩子之间的空间?
- DSL元素android.dataBinding。enabled'已过时,已被'android.buildFeatures.dataBinding'取代
- ConstraintLayout:以编程方式更改约束
- PANIC: AVD系统路径损坏。检查ANDROID_SDK_ROOT值
- 如何生成字符串类型的buildConfigField
- Recyclerview不调用onCreateViewHolder
- Android API 21工具栏填充
- Android L中不支持操作栏导航模式
- 如何在TextView中添加一个子弹符号?
- PreferenceManager getDefaultSharedPreferences在Android Q中已弃用
- 在Android Studio中创建aar文件