android自定义广播实现app完全退出

  完全退出应用程序是一个基本的不能再基本的功能了,每个APP都会有这个功能,在java中这个功能很容易就实现了,这里就不多说了,但在android里,却好像没有那么容易,查阅了网上相关的资料和博客,大概有以下几种方法:

  1.利用 PackageManager关闭所有本程序相关的进程,有人说2.2以上此法就失效了,没有亲自试过,不枉下断言,感兴趣的可以自己试.

   2.利用java的exit()方法+android的killProcess(int pid); 小米3上亲测不可用,只能关掉当前Activity,可能在其它android系统中可以,但至少说明不通用.

   3.创建一个List<Activity>将所有新启动的Activity都加入到此列表中,在退出应用时,执行遍历此集合,将所有Activity关闭,可以勉强实现退出整个应用,缺点:代价太大,要在整个应用的生命同期中维护一个List,极易产生内存堆积,处理不好就是内存溢出,亲测会有内存堆积和溢出的现象,在小米1上溢出的更频繁.而且如果未关闭的Activity比较多的话,退出时会明显有一个卡的过程,用户体验不好.

   以上三种方法要不是不通用,要不就是不好用,看到过一篇博客,推荐用广播的方式去关闭整个应用程序,思路就是为所有的Activity创建一个父类,只要在父类中注册一个自定义关闭应用广播即可实现,仔细想了一下这个方法是可行的,只要在基类中动态注册一个广播就可实现这个功能.以下是自己写的一个退出应用的demo,具体到不同的应用中,只要稍加调整就可以使用:


//自定义一个广播接收器,用来接收应用程序退出广播.
public class ExitAppReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        if (context != null) {

            if (context instanceof Activity) {

                ((Activity) context).finish();
            } else if (context instanceof FragmentActivity) {

                ((FragmentActivity) context).finish();
            } else if (context instanceof Service) {

                ((Service) context).stopSelf();
            }
        }
    }
}

//应用程序中所有Activity的基类
public class BaseActivity extends Activity  {
	
	private ExitAppReceiver exitReceiver = new ExitAppReceiver();
       //自定义退出应用Action,实际应用中应该放到整个应用的Constant类中.
        private static final String EXIT_APP_ACTION = "com.micen.exit_app";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		registerExitReceiver();
	}

	private void registerExitReceiver() {

          	IntentFilter exitFilter = new IntentFilter();
		exitFilter.addAction(EXIT_APP_ACTION);
		registerReceiver(exitReceiver, exitFilter);
	}

	private void unRegisterExitReceiver() {

		unregisterReceiver(exitReceiver);
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		unRegisterExitReceiver();
	}

	@Override
	protected void onStart() {
		super.onStart();
	}

	@Override
	protected void onStop() {
		super.onStop();
	}
}
    
    //最后在要退出App的方法中添加以下发送广播代码即可.
    Intent intent = new Intent();
    intent.setAction(EXIT_APP_ACTION);
    sendBroadcast(intent);

  这个方法是我认为目前最好的退出整个应用的方法,即不会产生内存堆积,退出整个应用的时间也很短,提高了用户体验,实现起来也很简单.



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,以下是实现水平进度条的自定义 View 的步骤: 1. 定义属性 在自定义 View 的类中定义属性,包括进度条的颜色、背景色、高度等等。 ```java public class HorizontalProgressBar extends View { private int mProgressColor; private int mBackgroundColor; private int mHeight; private int mMax; private int mProgress; ... } ``` 2. 重写 onMeasure() 方法 在 onMeasure() 方法中,设置 View 的宽度和高度,以及默认值。 ```java @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(width, mHeight); if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY) { height = MeasureSpec.getSize(heightMeasureSpec); } else { height = mHeight; } setMeasuredDimension(width, height); } ``` 3. 重写 onDraw() 方法 在 onDraw() 方法中,绘制进度条和背景。 ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); float ratio = (float) mProgress / (float) mMax; int progressWidth = (int) (getWidth() * ratio); // 绘制背景 Paint bgPaint = new Paint(); bgPaint.setColor(mBackgroundColor); canvas.drawRect(0, 0, getWidth(), getHeight(), bgPaint); // 绘制进度 Paint progressPaint = new Paint(); progressPaint.setColor(mProgressColor); canvas.drawRect(0, 0, progressWidth, getHeight(), progressPaint); } ``` 4. 设置属性 在自定义 View 的 XML 布局中设置属性,如下: ```xml <com.example.customview.HorizontalProgressBar android:id="@+id/horizontal_progress_bar" android:layout_width="match_parent" android:layout_height="wrap_content" app:progressColor="@color/colorPrimary" app:backgroundColor="@color/gray" app:height="5dp" app:max="100" app:progress="30" /> ``` 5. 在代码中使用 在代码中获取自定义 View,设置进度值。 ```java HorizontalProgressBar progressBar = findViewById(R.id.horizontal_progress_bar); progressBar.setProgress(50); ``` 以上就是实现水平进度条的自定义 View 的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值