当前位置:首页 » 安卓系统 » android销毁activity

android销毁activity

发布时间: 2022-09-20 05:30:27

A. android中启动service的activity销毁了,这时怎么关闭service

droid中怎么启动关闭Service及功能解释 .
7.16,杭州。阿里百川无线开放大会。阿里与开发者一起见证移动的力量
什么是Service?
解惑:
1、 Service不是分离开的进程,除非其他特殊情况,它不会运行在自己的进程,而是作为启动运行它的进程的一部分。
2、 Service不是线程,这意味着它将在主线程里劳作。
启动service有两种方法:
1、 Context.startService()
调用者与服务之间没有关联,即使调用者退出,服务仍可运行
2、 Context.bindService()
调用者与服务绑定在一起,调用者一旦退出,服务也就终止
Service的生命周期
如果使用startService()启动service,系统将通过传入的Intent在底层搜索相关符合Intent里面信息的service。如果服务没有启动则先运行onCreate,然后运行onStartCommand (可在里面处理启动时传过来的Intent和其他参数),直到明显调用stopService或者stopSelf才将停止Service。无论运行startService多少次,只要调用一次stopService或者stopSelf,Service都会停止。使用stopSelf(int)方法可以保证在处理好intent后再停止。
控制service运行的主要方式有两种,主要是根据onStartCommand方法返回的数值。方法:
1、START_STICKY
2、START_NOT_STICKY or START_REDELIVER_INTENT
这里主要解释这三个变量的意义:
1、 START_STICKY
在运行onStartCommand后service进程被kill后,那将保留在开始状态,但是不保留那些传入的intent。不久后service就会再次尝试重新创建,因为保留在开始状态,在创建 service后将保证调用onstartCommand。如果没有传递任何开始命令给service,那将获取到null的intent
2、 START_NOT_STICKY
在运行onStartCommand后service进程被kill后,并且没有新的intent传递给它。Service将移出开始状态,并且直到新的明显的方法(startService)调用才重新创建。因为如果没有传递任何未决定的intent那么service是不会启动,也就是期间onstartCommand不会接收到任何null的intent。
3、 START_REDELIVER_INTENT
在运行onStartCommand后service进程被kill后,系统将会再次启动service,并传入最后一个intent给onstartCommand。直到调用stopSelf(int)才停止传递intent。如果在被kill后还有未处理好的intent,那被kill后服务还是会自动启动。因此onstartCommand不会接收到任何null的intent。
客户端也可以使用bindService来保持跟service持久关联。谨记:如果使用这种方法,那么将不会调用onstartCommand(跟startService不一样,下面例子注释也有解析,大家可试试)。客户端将会在onBind回调中接收到IBinder接口返回的对象。通常IBinder作为一个复杂的接口通常是返回aidl数据。
Service也可以混合start和bind一起使用。
权限
要运行service,首先必须在AndroidManifest.xml里申明<service>标签。
Service能够保护个人的IPC调用,所以在执行实现该调用时前先使用checkCallingPermission(String) 方法检查是否有这个权限。

进程生命周期
当service运行在低内存的环境时,将会kill掉一下存在的进程。因此进程的优先级将会很重要:
1、 如果service当前正在执行onCreate、onStartCommand、onDestroy方法,主进程将会成为前台进程来保证代码可以执行完成避免被kill
2、 如果service已经启动了,那么主进程将会比其他可见的进程的重要性低,但比其他看不见的进程高。因为只有少部分进程始终是用户可见的,因此除非在极度低内存的时候,不然 service是不会被kill的。
3、 如果有客户端关联到service,那么service永远比客户端重要。也就是说客户端可见,那么service也可见(我理解这里的可见并不是可以看到,而是重要性,因为可见往往就表示重要性高)。
4、 Service可以使用startForeground API将service放到前台状态。这样在低内存时被kill的几率更低,但是文档后面又写了,如果在极度极度低内存的压力下,该service理论上还是会被kill掉。但这个情况基本不用考虑。
当然如果service怎么保持还是被kill了,那你可以通过重写onStartCommand返回变量来设置它的启动方式。比如:START_STICKY、START_REDELIVER_INTENT等等,前面已经讨论了它们的作用,这里就不再累赘了
另外:
service 的onCreate和onStartCommand 是运行在主线程的,所以如果里面有处理耗时间的任务。两种处理:
1、 请将它们都挪到新的线程里。
2、 用系统提供的IntentService,它继承了Service,它处理数据是用自身新开的线程。

启动关闭service实例

===================main文件========================
package com.services.coms;
import java.io.FileFilter;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainService extends Activity {
private TextView textviewService;
private Button buttonStart ,buttonStop;
public static final int CMD_STOP_SERVICE = 0;
DataReceiver dateReceiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textviewService=(TextView)findViewById(R.id.textservice);
buttonStart=(Button)findViewById(R.id.buttonstart);
buttonStop=(Button)findViewById(R.id.buttonstop);
buttonStart.setOnClickListener(buttonClick);
buttonStop.setOnClickListener(buttonClick);
}

private View.OnClickListener buttonClick =new View.OnClickListener() {
@Override
public void onClick(View v) {
if(v==buttonStart){
Intent intentService=new Intent(MainService.this,MyService.class);
startService(intentService);
Log.i("onStartCommand", "OnClickListener=");
}else if(v==buttonStop){
Intent intent=new Intent();
intent.setAction("AAAAA");
intent.putExtra("cmd",CMD_STOP_SERVICE);
sendBroadcast(intent);
}

}
};
private class DataReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
Log.i("onStartCommand", "接受要更新的广播数据="+intent.getStringExtra("data"));
String Date=intent.getStringExtra("data");
textviewService.setText(Html.fromHtml("<font color='#0066CC'><u>"+"Service的数据为:"+Date+"</font>"));
}
}
@Override
protected void onStart() {
dateReceiver=new DataReceiver();
IntentFilter intentfilter=new IntentFilter();// 创建IntentFilter对象
intentfilter.addAction("AAAAA");
registerReceiver(dateReceiver, intentfilter);// 注册Broadcast Receiver
super.onStart();
}
@Override
protected void onStop() {
unregisterReceiver(dateReceiver);// 取消注册Broadcast Receiver
super.onStop();
}

}
===================service文件===================
package com.services.coms;
import java.util.UUID;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
CommandReceiver cmdReceiver;
boolean flag;

@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
}
@Override
public void onCreate() {
cmdReceiver=new CommandReceiver();
flag=true;
Log.i("onStartCommand", "onCreate=");
super.onCreate();
}
@Override
public void onDestroy() {
this.unregisterReceiver(cmdReceiver);// 取消BroadcastReceiver
super.onDestroy();
}
@Override
public void onLowMemory() {
// TODO Auto-generated method stub
super.onLowMemory();
}
@Override
public void onRebind(Intent intent) {
// TODO Auto-generated method stub
super.onRebind(intent);
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("onStartCommand", "onStartCommand=");
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("AAAAA");
registerReceiver(cmdReceiver, intentFilter);
doJob();// 调用方法启动线程

return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
return super.onUnbind(intent);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
//接受广播
private class CommandReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
int cmd=intent.getIntExtra("cmd", -1);
if(cmd==MainService.CMD_STOP_SERVICE){//如果等于0
flag=false;//停止线程
stopSelf();//停止服务
}
}

}
public void doJob(){
new Thread(){
@Override
public void run() {
while(flag){//如果==true执行发送广播
try {
Thread.sleep(1000);//休眠1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("onStartCommand", "run=");
Intent intent=new Intent();
intent.setAction("AAAAA");
intent.putExtra("data",UUID.randomUUID()+"");
sendBroadcast(intent);//发送广播名称aaaaa 参数名字data

}
}
}.start();
}
}

==================layout文件=====================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/textservice"
></TextView>
<Button
android:id="@+id/buttonstart"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="启动服务"
android:gravity="center"
></Button>
<Button
android:id="@+id/buttonstop"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="停止服务"
android:gravity="center"
></Button>
</LinearLayout>

原文链接:http://blog.csdn.net/centralperk/article/details/7764379

B. android 中按下返回键销毁activity的详细调用过程。 求大神解答。

	@Override
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
//TODOAuto-generatedmethodstub
if(keyCode==KeyEvent.ACTION_DOWN){
MainActivity.this.finish();
returntrue;
}

returnsuper.onKeyDown(keyCode,event);
}
这个是按返回键就会销毁activity,双击销毁是判断你双击的点击事件间隔时间
小于300ms就销毁activity的

C. android 如何关闭指定的Activity

1、可以用一个统一管理容器list,把所有启动activity放到一起,关闭C的时候,也把B找出来关闭。
2、另一个方法是,可以关闭C的时候,把其他所有A和B都销毁,然后再重新启动一个A。

D. Android如何不让Activity销毁

activity自动回收是有activity生命周期决定的,当activity退出或失去焦点(按home除外)后,就被销毁了,activity不可后台运行,你不能改变。能后台运行的是services,broadcastreceiver。

E. android:当Activity和Service 都被销毁后,如何控制其中生成的线程

1.首先
android
一个程序中
的activity
都是一个线程,service和activity也是一个线程
2.在activity
中启动一个子线程,当前activity
finish
destroy掉
子线也会运行的。
3.在service里的线程
与activity很类似
service即使停止了
线程也在运行(要先停止服务
再把最近使用的进程杀掉
线程会停止
,如果直接杀掉进程
android会再次自动启动这个service的
此时即使再停止service服务
线程也会一直运行了除非关机)
activity
finish
子线程依旧可以运行,即使程序退出了子线程也在运行
(除非在任务管理器里
把最近使用的进程杀掉)
4.JVM有很好的管理机制,系统最后会自动释放回收。作为手动回收来说,你可以调用interrupt

F. Android开发中当一个activity被销毁,他内部的所有成员变量(定义的button,textview..)都会被销毁吗

销毁的时候,有方法会处理这些事,这些内部的成员变量,因为不会再被使用,就要被销毁。

我没有系统学过Android,但是他是用java语言开发,那么机制应该和java一样。
java有专门的垃圾回收机制,你不用了的,垃圾回收就会将这些用不到的东西回收掉。(我想,活动里面,稍微复杂点。)

G. Android之Activity全面解析,有些知识点容易忘记

Activity作为安卓四大组件之一,是最重要也是用得最多的组件,涉及的知识点非常多,有些知识点平时开发很少用到,但在某些场景下需要特别注意,本文详细整理了Activity涉及的知识点,供开发参考。

针对Activity可以提出很多问题,如:
Activity 的生命周期?
Activity 之间的通信方式?
Activity 各种情况下的生命周期?
横竖屏切换时 Activity 的生命周期?
前台切换到后台,然后再回到前台时 Activity 的生命周期?
弹出 Dialog 的时候按 Home 键时 Activity 的生命周期?
两个Activity之间跳转时的生命周期?
下拉状态栏时 Activity 的生命周期?
Activity 与 Fragment 之间生命周期比较?
Activity 的四种 LaunchMode(启动模式)的区别?
Activity 状态保存与恢复?
Activity的转场动画有哪些实现方式?
Activity的生命周期中怎么获取控件宽高?
onNewIntent的执行时机?
如何连续退出多个Activity?

如何把Acitivty设置成Dialog样式 ,android:theme="@android:style/Theme.Dialog"

关于横竖屏切换的生命周期,对应不同的手机,由于厂商定制的原因,会有不同的效果,如设置了configChanges="orientation”在有些手机会执行各个生命周期,但有些手机却不会执行。
网上常见的结论如下:

但实际的测试如下:

可以看出,不同厂商的手机切屏生命周期会有差异。
从API 13以上,当设备在横竖切屏时,“屏幕尺寸”也会发生变化,因此为了杜绝切屏导致页面销毁重建,需要加上screenSize,使用设置4,即 android:configChanges="orientation|keyboardHidden|screenSize" .

Activity的四种状态如下:

在activity处于paused或者stoped状态下,如果系统内存紧张,可能会被销毁,当重回该activity时会重建,正常返回和被回收后返回的生命周期如下:

如果是回收后返回,onCreate的参数savedInstanceState不为空。

有哪些场景会触发onNewIntent回调呢?跟启动模式有关,首先该Activity实例已经存在,再次启动才可能触发。一种情况是启动模式是singleTask或者singleInstance,无论该activity在栈中哪个位置,都会触发onNewIntent回调,并且把上面其他acitivity移除,另一种情况是启动模式是singleTop或者以FLAG_ACTIVITY_SINGLE_TOP启动,并且该activity实例在栈顶,会触发onNewIntent,如果不在栈顶是重新创建的,不会触发。

在实际业务开发中,往往碰到需要连续退出多个activity实例,下面整理了几种常见方法:

● 发送特定广播
1、在需要处理连续退出的activity注册该特定广播;
2、发起退出的activity发送该特定广播;
3、接收到该广播的activity 调用finish结束页面。
● 递归退出
1、用startActivityForResult启动新的activity;
2、前一个页面finish时,触发onActvityResult回调,再根据requestCode和resultCode处理是否finish,达到递归退出的效果。
● FLAG_ACTIVITY_CLEAR_TOP
通过intent.setFlag(Intent.FLAG_ACTIVITY_CLEAR_TOP)启动新activity,如果栈中已经有该实例,则会把该activity之上的所有activity关闭,达到singleTop启动模式的效果。
● 自定义activity栈
1、自定义activity列表,新打开activity则加入栈中,关闭则移除栈;
2、需要退出多个activity时,则循环从栈中移除activity实例,并调用finish。

在讨论Activity启动模式经常提到任务栈,那到底什么是任务栈?
任务是一个Activity的集合,它使用栈的方式来管理其中的Activity,这个栈又被称为返回栈(back stack),栈中Activity的顺序就是按照它们被打开的顺序依次存放的。返回栈是一个典型的后进先出(last in, first out)的数据结构。下图通过时间线的方式非常清晰地向我们展示了多个Activity在返回栈当中的状态变化:

taskAffinity 任务相关性,可以用于指定一个Activity更加愿意依附于哪一个任务,在默认情况下,同一个应用程序中的所有Activity都具有相同的affinity, 名字为应用的包名。当然了,我们可以为每个 Activity 都单独指定 taskAffinity 属性(不与包名相同)。taskAffinity 属性主要和 singleTask 启动模式和 allowTaskReparenting 属性配对使用,在其他情况下没有意义。
taskAffinity 有下面两种应用场景:

分为显示启动和隐式启动。
(1)显示启动
直接指定待调整的Activity类名。

(2)隐式启动
Intent 能够匹配目标组件的 IntentFilter 中所设置的过滤信息,如果不匹配将无法启动目标 Activity。IntentFilter 的过滤信息有 action、category、data。
IntentFilter 需要注意的地方有以下:
● 一个 Activity 中可以有多个 intent-filter
● 一个 intent-filter 同时可以有多个 action、category、data
● 一个 Intent 只要能匹配任何一组 intent-filter 即可启动对应 Activity
● 新建的 Activity 必须加上以下这句,代表能够接收隐式调用
<category android:name="android.intent.category.DEFAULT" />

只要匹配一个action即可跳转,注意的是action要区分大小写。

规则:如果intent中有category,则所有的都能匹配到intent-filter中的category,intent中的category数量可用少于intent-filter中的。另外,单独设置category是无法匹配activity的,因为category属性是一个执行Action的附加信息。

intent不添加category会匹配默认的,即 “android:intent.category.DEFAULT”
如果上面例子,如果去掉intent.setAction("action_name"),则会抛出异常:

规则:类似action,但data有复杂的结构,只要匹配一个data并且与data中所有属性都一致就能匹配到Activity,只要有1个属性不匹配,都无法找到activity。
data的结构:

data 主要是由 URI 和 mimeType 组成的。
URI 可配置很多信息,的结构如下:

与url类似,例如:

mineType:指资源类型包括文本、图片、音视频等等,例如:text/plain、 image/jpeg、video/* 等

下面看下data匹配的例子:
只匹配scheme

只匹配scheme也是能匹配到activity的。

匹配scheme、host、port
将上面的data改为

匹配mineType

如果有mineType,则不能仅设置setData或setMineType了,因为setData会把mineType置为null,而setMineType会把data置为null,导致永远无法匹配到activity,要使用setDataAndType。

使用scheme的默认值contentfile

注意该方法需要在startAtivity方法或者是finish方法调用之后立即执行,不能延迟,但可以在子线程执行。

而在windowAnimationStyle中存在四种动画:
activityOpenEnterAnimation // 打开新的Activity并进入新的Activity展示的动画
activityOpenExitAnimation // 打开新的Activity并销毁之前的Activity展示的动画
activityCloseEnterAnimation //关闭当前Activity进入上一个Activity展示的动画
activityCloseExitAnimation // 关闭当前Activity时展示的动画

overridePendingTransition的方式比较生硬,方法也比较老旧了,不适用于MD风格,google提供了新的转场动画ActivityOptions,并提供了兼容包ActivityOptionsCompat。

我们知道在onCreate和onResume里面直接获取到控件宽高为0,那有什么办法获取到控件的实际宽高?只要有onWindowFocusChanged、view.post、ViewTreeObserver三种方式获取。

当用户点击桌面图标启动APP时,背后的流程如下:

我们看到的手机桌面是Launch程序的界面,点击应用图标会触发点击事件,调用startActivity(intent),然后通过Binder IPC机制,与ActivityManagerService(AMS)通讯,AMS执行一系列操作,最终启动目前应用,大概流程如下:

通过PackageManager的resolveIntent()收集跳转intent对象的指向信息,然后通过grantUriPermissionLocked()方法来验证用户是否有足够的权限去调用该intent对象指向的Activity。如果有权限,则在新的task中启动目标activity,如果发现没有进程,则先创建进程。

如果进程不存在,AMS会调用startProcessLocked创建新的进程,在该方法中,会通过socket的通讯方式通知zygote进程孵化新的进程并返回pid,在新的进程中会初始化ActivityThread,并依次调用Looper.prepareLoop()和Looper.loop()来开启消息循环。

创建好进程后下一步要将Application和进程绑定起来,AMS会调用上一节创建的ActivityThread对象的bindAppliction方法完成绑定工作,该方法会发送一条BIND_APPLICATION的消息,最终会调用handleBindApplication方法处理消息,并调用makeApplication方法处理消息,加载APP的classes到内存中。

通过前面的步骤,系统已经拥有了该Application的进程,后续的启动则是从已存在其他进程中启动Acitivity,即调用realStartAcitvityLocked,该方法会调用Application的主线程对象ActivityThread的sheleLaunchActivity方法,在方法中会发送LAUNCH_ACTIVITY到消息队列,最终通过handleLaunchActivity处理消息,完成Acitivty的启动。

Activity
Activity 的 36 大难点,你会几个?“建议收藏”
[译]Android Application启动流程分析

H. android中怎么销毁当前的activity

执行finish()方法

android的生命周期包括onCreate,onStart,onResume,onPause,onStop,onDestroy
当调用finish方法后会执行onPause,onStop,onDestroy

I. android怎么在一个activity中finish掉另外一个activity

假如A,B两个Activity。

现在因为不清楚你的需求,我只能假设两种方法。

第一种

A跳转到B.这种情况下如何关闭A。在A跳转前。A.this.finish();

然后再执行跳转。

第二种

就是必须的在B中结束A。

{

privatestaticMap<String,Activity>destoryMap=newHashMap<>();

(){
}

/**
*添加到销毁队列
*
*@paramactivity要销毁的activity
*/

(Activityactivity,StringactivityName){
destoryMap.put(activityName,activity);
}
/**
*销毁指定Activity
*/
(StringactivityName){
Set<String>keySet=destoryMap.keySet();
for(Stringkey:keySet){
if(key.equals(activityName)){
destoryMap.get(key).finish();
}
}
}
}

在A创建的时候,调用 add方法把当前的A添加进去。

当需要结束的时候,在B中调用destoryActivity方法,指定添加A时的Key值来finish 掉A

J. 怎么让android的activity跳转到下一个activity时让前一个activity销毁

Android之Activity的几种跳转方式
1.显示调用方法
Intent intent=new Intent(this,OtherActivity.class); //方法1
Intent intent2=new Intent();
intent2.setClass(this, OtherActivity.class);//方法2
intent2.setClassName(this, "com.zy.MutiActivity.OtherActivity"); //方法3 此方式可用于打开其它的应用
intent2.setComponent(new ComponentName(this, OtherActivity.class)); //方法4
startActivity(intent2);
然后调用finish():结束当前Activity

2.隐式调用方法(只要action、category、data和要跳转到的Activity在AndroidManifest.xml中设置的匹配就OK

3.跳转到另一个Activity后,当返回时能返回数据
在跳转的Activity端,调用startActivityForResult(intent2, 1),跳转到下一个Activity,其中第一个参数为传入的意图对象,第二个为设置的请求码;
跳转到第二个Activity后,调用setResult(100, intent)方法可返回上一个Activity,其中第一个参数为结果码,第二个为传入的意图对象;
在第一个Activity通过onActivityResult()方法获得返回的数据。

热点内容
办公服务器什么系统好 发布:2025-01-11 23:50:06 浏览:346
boat服务器怎么开 发布:2025-01-11 23:48:57 浏览:484
安卓手机视频怎么快进 发布:2025-01-11 23:46:18 浏览:353
电脑的项目怎么连接远端服务器 发布:2025-01-11 23:45:25 浏览:852
sql语句between 发布:2025-01-11 23:45:14 浏览:327
王者安卓转换苹果系统会损失什么 发布:2025-01-11 23:45:13 浏览:737
安卓手机涨价怎么办 发布:2025-01-11 23:27:17 浏览:712
三消游戏服务器搭建 发布:2025-01-11 23:20:01 浏览:246
c语言的函数不可单独进行编译 发布:2025-01-11 23:12:33 浏览:18
怎么查信用卡查询密码 发布:2025-01-11 23:11:08 浏览:572