请问大神,关于Activity不能完全finish的问题

sulinly 2018-01-12 04:23:26
MainActivity 启动服务后台服务后执行Finnish,将MainActivity停止,见代码1。执行后MainActivity界面的确不见了,按手机多任务键(有的手机是长按home键)检查,多任务里该程序不见了,后台服务也能正常运行。此时按多任务键界面里的全部关闭程序,所有多任务程序被关闭掉,但后台程序依然能正常运行。

问题:如果将finish放到MainActivity的buton中执行,见代码2。按钮执行后MainActivity界面的确不见了,但是按手机多任务键检查,多任务里该程序依然存在。此时按多任务键界面里的全部关闭程序,所有多任务程序被关闭掉,同时后台程序同时被关闭。为何将finish放到按钮中执行就不正常了,咋个解决呢?

代码1:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//启动服务
Intent i1 = new Intent(this, MyService.class);
startService(i1);
finish();
}
}


代码2:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//启动服务
Intent i1 = new Intent(this, MyService.class);
startService(i1);
// finish();
setContentView(R.layout.activity1);
findViewById(R.id.btn_hide).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});

}
}


手机的多任务界面:
...全文
863 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sulinly 2018-01-16
  • 打赏
  • 举报
回复
引用 2 楼 usecf 的回复:
打印下log adb logcat 看看报什么错误 或者异常
发现不通过按钮的finish的确有报错,应该是报错引起的任务清单里没有该程序吧。谢谢大神,我在想是不是可以用这个bug做个保活程序呢? 01-16 23:39:26.723 25313-25313/com.sugem.autoweb E/AndroidRuntime: FATAL EXCEPTION: main Process: com.sugem.autoweb, PID: 25313 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sugem.autoweb/com.sugem.autoweb.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2735) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2796) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1521) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6265) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:906) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796) Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. at android.support.v7.app.AppCompatDelegateImplV9.createSubDecor(AppCompatDelegateImplV9.java:354) at android.support.v7.app.AppCompatDelegateImplV9.ensureSubDecor(AppCompatDelegateImplV9.java:323) at android.support.v7.app.AppCompatDelegateImplV9.findViewById(AppCompatDelegateImplV9.java:233) at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:190) at com.sugem.autoweb.MainActivity.onCreate(MainActivity.java:48) at android.app.Activity.performCreate(Activity.java:6774) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2688) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2796)  at android.app.ActivityThread.-wrap12(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1521)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6265)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:906)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796) 
sulinly 2018-01-16
  • 打赏
  • 举报
回复
引用 4 楼 qq_38074369 的回复:
只是代码运行先后顺序而已,界面是在onResume走完之后才可交互的,提前finish了,只是变成无界面进程了,程序还是在的,只是你看不到;而按钮可以点击时,早已变为可交互状态了,当然是有界面的进程了。我只是好奇你的后台为什么不会被一键清理,可以看下源码吗?
根据你的思路,我又研究了下,看能不能在有界面的情况下彻底关闭界面,我发现在主题设置为android:theme="@android:style/Theme.NoDisplay"时,能够彻底关闭界面,但只能在AndroidManifest.xml中设置,没找到动态设置的方法,你有其他方法关闭界面吗?
sulinly 2018-01-16
  • 打赏
  • 举报
回复
引用 4 楼 qq_38074369 的回复:
只是代码运行先后顺序而已,界面是在onResume走完之后才可交互的,提前finish了,只是变成无界面进程了,程序还是在的,只是你看不到;而按钮可以点击时,早已变为可交互状态了,当然是有界面的进程了。我只是好奇你的后台为什么不会被一键清理,可以看下源码吗?
引用 4 楼 qq_38074369 的回复:
只是代码运行先后顺序而已,界面是在onResume走完之后才可交互的,提前finish了,只是变成无界面进程了,程序还是在的,只是你看不到;而按钮可以点击时,早已变为可交互状态了,当然是有界面的进程了。我只是好奇你的后台为什么不会被一键清理,可以看下源码吗?
的确做了个小小的保活,很简单,做了个悬浮窗。现在我就是在测试再多任务状态下全部强制关闭程序时不依赖其他复杂手段靠程序自己如何能不被强制干掉的可能性,也不知道这个思路对不对。悬浮窗的代码很简单需要我可以发上来。
wkp111 2018-01-15
  • 打赏
  • 举报
回复
只是代码运行先后顺序而已,界面是在onResume走完之后才可交互的,提前finish了,只是变成无界面进程了,程序还是在的,只是你看不到;而按钮可以点击时,早已变为可交互状态了,当然是有界面的进程了。我只是好奇你的后台为什么不会被一键清理,可以看下源码吗?
wkp111 2018-01-15
  • 打赏
  • 举报
回复
你的后台service可以保活吗?能看一下源码吗?
usecf 2018-01-15
  • 打赏
  • 举报
回复
打印下log adb logcat 看看报什么错误 或者异常
Smoyan_ 2018-01-15
  • 打赏
  • 举报
回复
我觉得问题没有出在这里,应该在其他代码里,Activity没有结束肯定是因为还有其他线程或者mHandler任务没有完成, 而且正常的Activity调用finish destory以后,最近任务列表是会出现的。这是android模仿ios为了再次快速进入热启动
二维码现在越来越火爆,使用的越发广泛,对于二维码二维码的生成与解析,有多种途径,这里我选择用google老大的ZXing。    其中刘超大神使用ZXing写了一个快速集成二维码扫描的工具类,实现其核心的实现扫描的功能。使用时通过调用二维码工具类,几行代码就可以实现二维码扫描的功能! 一、实现对二维码的扫描 使用步骤: 1.在module的build.gradle中dependencies添加 compile 'cn.yipianfengye.android:zxing-library:2.1' 2.在Application中执行初始化操作 提示:在清单文件中注册Application public class MyApplication extends Application{ @Override public void onCreate() { super.onCreate(); //初始化二维码工具类 ZXingLibrary.initDisplayOpinion(this); } } 3.在清单文件配置权限(安卓6.0以上的手机还要额外的权限配置)。 4.在代码中执行打开扫描二维码界面操作  Intent intent = new Intent(MainActivity.this, CaptureActivity.class); startActivityForResult(intent, REQUEST_CODE); 这里的REQUEST_CODE是我们定义的int型常量,这里设置为5,为了方便接受onActivityResult分别进行处理。 5.在Activity的onActivityResult方法中接收扫描结果(下面有完整代码) protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 5) { if (null != data) { Bundle bundle = data.getExtras(); if (bundle == null) { return; } if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) { String result = bundle.getString(CodeUtils.RESULT_STRING); Toast.makeText(this, "解析结果:" + result, Toast.LENGTH_LONG).show(); } else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) { Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show(); } } } } 实现效果:(由于模拟器没有摄像头不能扫描二维码,手机录屏需要root,所以就截取了效果图) 第一张是进行二维码扫描,第二张是当扫描结束,显示信息。 只用区区几行代码,就可以实现二维码的快速扫描。 二、定制化显示扫描UI 1.在values的colors文件下添加颜色,决定了二维码四个边框的颜色 #0effc22. 2.在drawable文件下添加一个scan_image.png的图片,就是二维码扫描的那条横线 3.创建一个新的Activity(demo里叫 SecondActivity )集成FragmentActivity,在清单文件里进行配置。 4. 修改新的Activity布局文件,是二维码的背景布局 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_second" android:layout_width="match_parent" android:layout_height="match_parent">

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧