好吧,在我的应用程序中,我正在使用Android的默认摄像头和图库,其中startActivityforResult为;
Intent i = new Intent("android.intent.action.PICK",
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
i.setType("image/*");
startActivityForResult(i, this.SELECT_PICTURE);
Run Code Online (Sandbox Code Playgroud)
我也能够捕获onActivityResult.但是,如果内存很少并且我开始这个活动,我经历过该系统正在杀死我的父活动,即使活动返回一个值,我也丢失了所有的局部变量(并再次调用onCreate()).只应再次调用onResume().
我试了几次,我很确定它与内存问题有关.如果有足够的内存进程成功执行.我该如何防止这种行为?
由于Android不会在前台杀死应用程序,我还可以使用此功能吗?我认为我的问题与此问题几乎相似.
@Override
public void onSaveInstanceState(Bundle savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud) 我有一个具有IntentFilter和BroadcastReceiver的Activity,我将它们注册到我的onCreate().
IntentFilter filter = new IntentFilter(ACTION_RCV_MESSAGE);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new MessageReceiver();
registerReceiver(receiver, filter);
Run Code Online (Sandbox Code Playgroud)
但在结束我的应用程序时,Logcat说:
07-03 01:38:19.567:ERROR/ActivityThread(304):android.app.IntentReceiverLeaked:Activity com.intentservicetest5.IntentServiceTest5Activity泄露了最初在这里注册的IntentReceiver com.intentservicetest5.IntentServiceTest5Activity$MessageReceiver@44efe8a8.你是否错过了对unregisterReceiver()的调用?
但我确实有
public void onDestroy(Bundle savedInstanceState){
unregisterReceiver(receiver);
}
Run Code Online (Sandbox Code Playgroud)
当我打电话时,为什么我的活动仍在泄露unregisterReceiver()?
android broadcastreceiver android-lifecycle android-activity
我有这个问题.
我有一个动作A启动其他活动B(通过onclick - 按钮).
在乙我有一个后退按钮回来活性一个.我按它.
现在我在A,我再按一次按钮转到B.
如果我使用android后退按钮(我在B中)我首先回到A然后再回到B.
但是现在,如果我再次按下android后退按钮,我不会去A的previus活动或者它从app退出.我回到B !!!
我该如何防止这种行为?
有没有办法在按下后退时将更新的数据发送到父活动?我想更新捆绑包中的数据,但我不知道如何访问它.
例如,我有一个图库活动,可以打开图像查看器.假设用户滚动了十几个图像,然后退回到图库.使用他们查看的最后一张图像更新图库中的焦点图像是理想的.
目前,如果没有全球化的设置,我无法想到如何做到这一点.
这是我想做的伪代码(虽然这显然不起作用):
儿童:
@Override
public void onBackPressed() {
getIntent().setData(currentImage); // Not the right intent, obviously
super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)
家长:
@Override
public void onResume()
{
super.onResume();
Uri photoFocus = getIntent().getData();
if (photoFocus != null)
setPhotoFocus(photoFocus);
}
Run Code Online (Sandbox Code Playgroud) 我遇到一个片段中有两个可点击项的情况。项目A将当前片段与当前活动分离,并附加一个新片段。项目B导致一些UI更新。我的问题是,如果我快速连续单击它们两者,则应用程序崩溃。我在UI更新中得到了NullPointerException,因为显然该片段已经与项目A分离了。更直观的日志表示形式:
我正在使用运行4.2.2的Nexus 4。我正在使用Dagger进行依赖项注入,我认为这可能是问题的根源,但我在整个应用程序中看到了类似的边缘情况,其中几乎可以同时单击两件事,而崩溃问题有时会发生。没有注射。在每种情况下,这两种操作都将以看似未定义的顺序发生,这将导致奇怪的行为并崩溃。
有没有办法停止onStop或onDestroyView中的所有后续事件或飞行事件?还是我需要向每个UI侦听器中添加一个isDetached()检查?我还尝试在onDestroy中分离所有侦听器,从而消除了部分但并非全部崩溃。似乎我有一个与此未解决的问题类似的问题:在onDestroyView之后调用Fragment的OnClickListener。
我使用下面的代码检查最后Fragment一个Activity以弹出一个对话框
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// Check if there is only one fragment
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
DlgUniversalError.shallIQuit(this, getApplicationContext()
.getResources().getString(R.string.doYouWantToQuit),
getSupportFragmentManager());
return false;
}
}
return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)
现在假设我有一套Activitys.如何Activity判断Activity堆栈中是否为最后一个,并弹出退出对话框?
android android-lifecycle android-activity back-stack android-task
我继承了一些使用Application.ActivityLifecycleCallbacks的漂亮代码.我们正在使用该onActivityResumed方法在用户的会话超时时将用户带回登录屏幕.
API文档中没有关于其工作原理的文档.我们是否可以保证何时调用这些方法(即它们onResume是否在Activity中相应的方法之前调用),以及它们是否与正常的生命周期方法同步?
如果我不得不猜测,我会假设这些并行发生,这意味着个别活动/片段仍然需要安全地应对被注销.
当我启动应用程序时,我创建了两个Activity"SplashActivity和AuthenticationActivity",它将SplashScreen加载5秒并转移到AuthenticationActivity.现在我的问题是,当我运行应用程序时,它加载splashScreen,但在5秒内,当我点击后退按钮SplashActivity退出并立即AuthenticationActivity出现在前台.如何编码当我点击后退按钮我的应用程序应退出.我试过的代码如下
public class SplashActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
Thread splashTimer = new Thread(){
public void run(){
try{
sleep(5000);
startActivity(new Intent(SplashActivity.this,AuthenticationActivity.class));
finish();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
finish();
}
}
};
splashTimer.start();
}
@Override
public void onBackPressed() {
super.onBackPressed();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
}}
Run Code Online (Sandbox Code Playgroud) 我在片段中使用CountDownTimer。我希望计时器在应用程序进入后台时暂停,并在用户回来时恢复计时。正如其他SO问题所建议的那样,我取消了托管活动的onPause()中的计时器,并从同一时间点开始维护了onResume()中的新计时器(保持了静态变量millisLeft)。
我不知道为什么,但是onResume()中的计时器未再次启动(我尝试登录onResume(),但未显示任何日志,这意味着计时器从未启动)。请帮助我。谢谢。
public class MainFragment extends Fragment implements NavigationView.OnNavigationItemSelectedListener {
private View rootView;
private ComprehensionDb db;
CountDownTimer countDownTimer;
static long millisLeft;
TextView timer;
public static Fragment newInstance() {
return new MainFragment();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.main, container, false);
Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar);
toolbar.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorPrimary_comprehension));
toolbar.inflateMenu(R.menu.menu_main_white);
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.action_about:
AlertDialog.Builder builder =
new AlertDialog.Builder(getActivity());
builder.setTitle(String.format("%1$s", getString(R.string.comprehension_about_us)));
builder.setMessage(getResources().getText(R.text));
builder.setPositiveButton("OK", null);
AlertDialog …Run Code Online (Sandbox Code Playgroud) 我在代码中发现了一个错误,我们正在启动活动(让我们将其称为SCREEN_ACTIVITY)
Intent intent = new Intent(SharedIntents.INTENT_SCREEN);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
Android文档:使用FLAG_ACTIVITY_NEW_TASK时,如果任务已在您正在启动的活动上运行,则不会启动新活动; 相反,当前任务将简单地以最后一个状态被带到屏幕的前面.
所以在大多数情况下一切正常.
当用户点击某些内容时,该屏幕活动将调用finish().此屏幕活动也将通过服务的传入事件启动或创建.
6053 I/ScreenActivity(15395): onCreate
6682 E/ScreenActivity(15395): finish() Activity
6832 I/ScreenActivity(15395): onDestroy
7284 I/ScreenActivity(15395): onCreate
7911 E/ScreenActivity(15395): finish() Activity
8063 I/ScreenActivity(15395): onDestroy
10555 I/ScreenActivity(15395): onCreate
13413 E/ScreenActivity(15395): finish() Activity
13701 I/ScreenActivity(15395): onCreate
13799 I/ScreenActivity(15395): onDestroy
Run Code Online (Sandbox Code Playgroud)
最后一个是问题.创建ScreenActivity,然后调用finish()本身.但问题是onDestroy被称为很晚.在此之前,来自服务器的传入事件和调用startActivity()会触发一个新的ScreenAcitivty onCreate().问题是ScreenManager类保留了创建和销毁该活动的标志.
在onCreate()回调和onDestroy()回调时设置该标志.因此,对于第10555行和第13701行,ScreenManager设置createFlag = true.对于13799行,设置createFlag = false.在13799行假定未创建活动且未向活动通知事件之后,事件发生.
希望我对此问题的描述清楚.调用finish()后会发生这种情况onStop()和onDestroy()调用这么晚吗?如果是的话,我必须考虑解决方案.如果没有,那么有什么地方可以修改吗?
非常感谢.