[英]Android - Performing stop of activity that is not resumed
當我將我的應用程序推送到后台,並做一些其他的東西,如whatsapp或短信,onResume它很好。
但我最近發現,當我的應用程序在后台打開/啟動Facebook應用程序時,我不知道會發生什么...
但是onResume,應用程序行為不端......
不要做它需要做的事情,但當我回到主頁並回來它工作正常請幫助我..如何解決它?
包含所有消息的Logcat(不帶過濾器)
10-15 12:53:59.899: I/Adreno-EGL(32033): Remote Branch: quic/LNX.LA.3.5.1_RB1.1
10-15 12:53:59.899: I/Adreno-EGL(32033): Local Patches: NONE
10-15 12:53:59.899: I/Adreno-EGL(32033): Reconstruct Branch: AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018 + f2fd134 + NOTHING
10-15 12:53:59.924: D/OpenGLRenderer(32033): Enabling debug mode 0
10-15 12:54:00.000: V/AlarmManager(7677): sending alarm Alarm{42cfa490 type 3 android}
10-15 12:54:00.110: I/ActivityManager(7677): Displayed uk.org.humanfocus.hfi/.EvaluateTrainingActivity: +838ms
10-15 12:54:00.114: D/WifiStateMachine(7677): handleMessage: E msg.what=151572
10-15 12:54:00.114: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:00.114: D/WifiStateMachine(7677): processMsg: L2ConnectedState
10-15 12:54:02.258: V/AlarmManager(7677): sending alarm Alarm{42ebd600 type 1 com.facebook.katana}
10-15 12:54:02.274: V/AlarmManager(7677): sending alarm Alarm{42ec0ff0 type 1 com.android.chrome}
10-15 12:54:02.428: D/hardware_info(7386): hw_info_append_hw_type : device_name = speaker
10-15 12:54:03.011: W/BroadcastQueue(7677): Permission Denial: broadcasting Intent { act=android.net.conn.INET_CONDITION_ACTION flg=0x4000010 (has extras) } from null (pid=-1, uid=-1) requires com.facebook.permission.prod.FB_APP_COMMUNICATION due to registered receiver BroadcastFilter{41fdecd0 u0 ReceiverList{42b2f608 31941 com.facebook.katana/10103/u0 remote:429a17e8}}
10-15 12:54:03.011: W/BroadcastQueue(7677): Permission Denial: broadcasting Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 (has extras) } from null (pid=-1, uid=-1) requires com.facebook.permission.prod.FB_APP_COMMUNICATION due to registered receiver BroadcastFilter{41fdecd0 u0 ReceiverList{42b2f608 31941 com.facebook.katana/10103/u0 remote:429a17e8}}
10-15 12:54:03.118: D/WifiStateMachine(7677): handleMessage: E msg.what=151572
10-15 12:54:03.118: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:03.118: D/WifiStateMachine(7677): processMsg: L2ConnectedState
10-15 12:54:03.140: D/WifiStateMachine(7677): handleMessage: X
10-15 12:54:03.141: D/GCoreFlp(8174): Unknown pending intent to remove.
10-15 12:54:03.145: W/fb4a(:<default>):AbstractMqttPushService(31941): Attempt to start service that is already started
10-15 12:54:03.242: D/WifiStateMachine(7677): handleMessage: E msg.what=131155
10-15 12:54:03.242: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:03.243: D/WifiStateMachine(7677): processMsg: L2ConnectedState
10-15 12:54:03.245: D/WifiStateMachine(7677): handleMessage: X
10-15 12:54:03.319: D/dalvikvm(31941): GC_CONCURRENT freed 1833K, 9% free 20190K/22072K, paused 5ms+7ms, total 86ms
10-15 12:54:03.320: D/dalvikvm(31941): WAIT_FOR_CONCURRENT_GC blocked 68ms
10-15 12:54:03.323: W/MediaPlayer-JNI(31941): MediaPlayer finalized without being released
10-15 12:54:03.452: W/BroadcastQueue(7677): Permission Denial: broadcasting Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 (has extras) } from null (pid=-1, uid=-1) requires com.facebook.permission.prod.FB_APP_COMMUNICATION due to registered receiver BroadcastFilter{42b51d68 u0 ReceiverList{429feb50 31941 com.facebook.katana/10103/u0 remote:41fb8788}}
10-15 12:54:03.573: W/fb4a(:<default>):JACKSON_FALLBACK(31941): Using com.fasterxml.jackson.databind.deser.std.EnumDeserializer@42914bc8 to deserialize [simple type, class com.facebook.common.util.TriState]
10-15 12:54:03.587: W/fb4a(:<default>):JACKSON_FALLBACK(31941): Using com.fasterxml.jackson.databind.deser.std.EnumDeserializer@42bb3100 to deserialize [simple type, class com.facebook.contacts.graphql.contactprofiletype.ContactProfileType]
10-15 12:54:03.957: D/dalvikvm(31941): GC_CONCURRENT freed 3400K, 15% free 20455K/23952K, paused 4ms+7ms, total 88ms
10-15 12:54:03.957: D/dalvikvm(31941): WAIT_FOR_CONCURRENT_GC blocked 75ms
10-15 12:54:04.099: W/fb4a(:<default>):JACKSON_FALLBACK(31941): Using BeanSerializer for com.facebook.katana.newbookmark.qe.NewBookmarkConfig to serialize class com.facebook.katana.newbookmark.qe.NewBookmarkConfig
10-15 12:54:04.119: D/WifiStateMachine(7677): handleMessage: E msg.what=151572
10-15 12:54:04.120: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:04.120: D/WifiStateMachine(7677): processMsg: L2ConnectedState
10-15 12:54:04.124: D/WifiStateMachine(7677): handleMessage: X
10-15 12:54:04.177: W/fb4a(:<default>):JACKSON_FALLBACK(31941): Using com.fasterxml.jackson.databind.deser.std.EnumDeserializer@42a30980 to deserialize [simple type, class com.facebook.platform.webdialogs.PlatformWebViewActionManifest$FetchState]
10-15 12:54:04.197: I/dalvikvm(31941): Could not find method com.android.internal.widget.ILockSettings$Stub.a, referenced from method com.facebook.keyguardtype.LockSettingsServiceKeyguardTypeResolver.b
10-15 12:54:04.197: W/dalvikvm(31941): VFY: unable to resolve static method 5338: Lcom/android/internal/widget/ILockSettings$Stub;.a (Landroid/os/IBinder;)Lcom/android/internal/widget/ILockSettings;
10-15 12:54:04.197: D/dalvikvm(31941): VFY: replacing opcode 0x71 at 0x0023
10-15 12:54:04.440: I/SBar.NetworkController(7758): onSignalStrengthsChanged SignalStrength: 19 0 -120 -160 -120 -1 -1 99 2147483647 2147483647 2147483647 2147483647 2147483647 gsm|lte 0 -108 -1 false 5 5 0 0 0 99 99 99 5 level=5
10-15 12:54:04.814: V/WebViewChromiumFactoryProvider(31941): Binding Chromium to main looper Looper (main, tid 1) {41f8cbd0}
10-15 12:54:04.815: I/LibraryLoader(31941): Expected native library version number "",actual native library version number ""
10-15 12:54:04.816: I/chromium(31941): [INFO:library_loader_hooks.cc(116)] Chromium logging enabled: level = 0, default verbosity = 0
10-15 12:54:04.817: I/BrowserStartupController(31941): Initializing chromium process, renderers=0
10-15 12:54:04.822: E/AudioManagerAndroid(31941): BLUETOOTH permission is missing!
10-15 12:54:04.864: W/chromium(31941): [WARNING:proxy_service.cc(890)] PAC support disabled because there is no system implementation
10-15 12:54:05.121: D/WifiStateMachine(7677): handleMessage: E msg.what=151572
10-15 12:54:05.121: D/WifiStateMachine(7677): processMsg: ConnectedState
10-15 12:54:05.122: D/WifiStateMachine(7677): processMsg: L2ConnectedState
這是onResume()
super.onResume();
if (backgroundThreadRunning == true) {
backgroundThreadRunning = false;
}
if (Constants.isVideoEditing)
editingProgress.setVisibility(View.VISIBLE);
else
editingProgress.setVisibility(View.GONE);
if (Constants.isAudioProcessing)
addAudioProgress.setVisibility(View.VISIBLE);
else
addAudioProgress.setVisibility(View.GONE);
if (isHomeKeyPressed() && !(isRecentActivity)) {
isRecentActivity = false;
homeKeyPressed(false);
AlertDialog.Builder ab = new AlertDialog.Builder(
CreateTrainingActivity.this);
ab.setMessage(
"Due to Other Application Launches, video process will be cancelled!\nAre you sure you want to cancel?")
.setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener).show();
}
};
編輯:我如何修復問題
我在onResume()
方法中編寫了這段代碼
try {
// check if any view exists on current view
style = ((Button) findViewById(R.id.xyz_button));
} catch (Exception e) {
// Button was not found
// It means, your button doesn't exist on the "current" view
// It was freed from the memory, therefore stop of activity was performed
// In this case I restart my app
Intent i = new Intent();
i.setClass(getApplicationContext(), MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
// Show toast to the user
Toast.makeText(getApplicationContext(), "Data lost due to excess use of other apps", Toast.LENGTH_LONG).show();
}
一行 :由於Android操作系統需要Facebook應用程序的內存,因此您的某些活動變量似乎已從內存中釋放出來。
說明 :當前台應用程序需要的內存多於可用內存時,Android會從后台運行的應用程序中釋放一些內存。 前台任務的優先級始終高於后台應用程序。
因此,在應用程序處於后台時可能發生的情況是,它的某些變量已丟失了您在onResume()中使用的值。 因此,當您再次將應用程序帶到前台並且由於某些代碼無法正常工作時,它們會重新創建,因此它們會保留錯誤的值或默認值(您可以使用Sysout進行檢查)。
只是給我50美分的問題。 捕獲異常確實是一種可能性,但處理活動被系統殺死的活動問題的正確方法是在android中的常見問題,根據谷歌的解決方案是:
onPause()是您處理離開活動的用戶的地方。 最重要的是, 此時應該提交用戶所做的任何更改 (通常是提交數據的ContentProvider)。
重點是我的。 但這意味着Android生命周期的設計是為了在正常條件下onPause
應該被調用為Activity
或Fragment
被發送到后台。 他們在幾個android文檔頁面中暗示了這一點:
當您的活動進入暫停狀態時,系統會調用您的活動上的onPause()方法,該方法允許您停止暫停時不應繼續的持續操作(例如視頻)或保留應永久保存的任何信息以防萬一用戶繼續離開您的應用。 如果用戶從暫停狀態返回到您的活動,系統將恢復它並調用onResume()方法。
注意:當您的活動收到對onPause()的調用時,可能表示活動暫停一段時間,用戶可能會將焦點重新調整到您的活動。 但是,這通常是用戶離開您的活動的第一個跡象。
但是最有可能幫助你的資源是這兩個:
http://developer.android.com/training/basics/activity-lifecycle/stopping.html
http://developer.android.com/training/basics/activity-lifecycle/recreating.html
您丟失的資源可能發生的事情是這樣的:
當您的活動收到對onStop()方法的調用時,它將不再可見,並且應該釋放用戶未使用時幾乎所有不需要的資源。 一旦您的活動停止,系統可能會在需要恢復系統內存時銷毀該實例。 ...默認情況下,系統使用Bundle實例狀態來保存活動布局中每個View對象的信息(例如輸入EditText對象的文本值)。 因此,如果您的活動實例被銷毀並重新創建,則布局的狀態將恢復到之前的狀態,而您無需代碼。 但是,您的活動可能包含您要恢復的更多狀態信息,例如跟蹤用戶在活動中的進度的成員變量。
注意:為了讓Android系統恢復活動中視圖的狀態,每個視圖必須具有唯一的ID,由android:id屬性提供。
要保存有關活動狀態的其他數據,必須覆蓋onSaveInstanceState()回調方法。 系統在用戶離開您的活動時調用此方法,並將其傳遞給Bundle對象,該對象將在您的活動意外銷毀時保存。 如果系統必須稍后重新創建活動實例,它會將相同的Bundle對象傳遞給onRestoreInstanceState()和onCreate()方法。
對此的正確解決方案是根據需要覆蓋和實現Activity / Fragment的生命周期方法。
Google給出的兩個例子:
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
Caution: Always call the superclass implementation of onSaveInstanceState() so the default implementation can save the state of the view hierarchy.
並且反向恢復操作:
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
希望你已經解決了這個問題,但你的代碼中有一個錯誤,可能是相關的:
if (backgroundThreadRunning = true) {
backgroundThreadRunning = false;
}
您要分配而不是在“if”語句中進行比較。 應該:
if (backgroundThreadRunning == true) {
backgroundThreadRunning = false;
}
要么
if (backgroundThreadRunning) {
backgroundThreadRunning = false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.