android上怎样让一个Service开机自动启动

android上怎样让一个Service开机自动启动,第1张

第一步:首先创建一个广播接收者,重构其抽象方法 onReceive(Context context, Intent intent),在其中启动你想要启动的Service或app。

import android.content.BroadcastReceiver

import android.content.Context

import android.content.Intent

import android.util.Log

public class BootBroadcastReceiver extends BroadcastReceiver {

//重写onReceive方法

@Override

public void onReceive(Context context, Intent intent) {

//后边的XXX.class就是要启动的服务

Intent service = new Intent(context,XXXclass)

context.startService(service)

Log.v("TAG", "开机自动服务自动启动.....")

//启动应用,参数为需要自动启动的应用的包名

Intent intent = getPackageManager().getLaunchIntentForPackage(packageName)

context.startActivity(intent )

}

}

第二步:配置xml文件,在receiver接收这种添加intent-filter配置

<receiver android:name="BootBroadcastReceiver">

<intent-filter>

<action android:name="android.intent.action.BOOT_COMPLETED"></action>

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</receiver>

第三步:添加权限 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

最大的可能是广播没有注册

1)第一种不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。(代码里注册)

2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。(androidmanifest.xml注册)

Android中,Activity的级别永完都没有来电这么高级别,因为手机最主要的功能,还是用来通话。

关于Android中的进程级别:

1、foreground process

正处于activity resume状态

正处于bound服务交互的状态

正处于服务在前台运行的状态(StartForeGround()被调用)

Service生命周期正在被执行(onCreate(),onStart(),onDestroy())

BroadcastReceiver正在执行onReceive()方法

杀死foreground需要用户响应,因为这个安全优先级是最高的

是用户 *** 作所必须的,任一时间下,仅有少数进程会处于前台,仅当内存实在无法供给它们维持同时运行时才会被杀死。一般来说,在这种情况下,设备依然处于使用虚拟内存的状态,必须要杀死一些前台进程以用户界面保持响应。

•Android会依据进程中当前活跃组件的重要程度来尽可能高的估量一个进程的级别。比如说,如果一个进程中同时有一个服务和一个可视的activity,则进程会被判定为可视进程,而不是服务进程。

2、visible process

activity不在前端显示,但也没有完全隐藏,能够看得见,比如d出一个对话框

一个bound到visible或者foreground的activity的service

没有前台组件,但仍可被用户在屏幕上所见。当满足如下任一条件时,进程被认为是可视的:

• 它包含着一个不在前台,但仍然为用户可见的activity(它的onPause()方法被调用)。这种情况可能出现在以下情况:比如说,前台activity是一个对话框,而之前的activity位于其下并可以看到。

• 它包含了一个绑定至一个可视的activity的服务。

可视进程依然被视为是很重要的,非到不杀死它们便无法维持前台进程运行时,才会被杀死。

3、Service process

正在运行的,不在上述两种状态的service

是由 startService() 方法启动的服务,它不会变成上述两类。尽管服务进程不会直接为用户所见,但它们一般都在做着用户所关心的事情(比如在后台播放mp3或者从网上下载东 西)。所以系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可视进程的运行需要。

4、background process

不可见状态的activity进程,onstop被调用

包含目前不为用户所见的activity(Activity对象的 onStop() 方法已被调用)。这些进程与用户体验没有直接的联系,可以在任意时间被杀死以回收内存供前台进程、可视进程以及服务进程使用。一般来说,会有很多背景进程 运行,所以它们一般存放于一个LRU(最后使用)列表中以确保最后被用户使用的activity最后被杀死。如果一个activity正确的实现了生命周 期方法,并捕获了正确的状态,则杀死它的进程对用户体验不会有任何不良影响。

5、empty process

没有运行任何component的进程,保留这个进程主要是为了缓存的需要

不包含任何活动应用程序组件。这种进程存在的唯一原因是做为缓存以改善组件再次于其中运行时的启动时间。系统经常会杀死这种进程以保持进程缓存和系统内核缓存之间的平衡。

此外,一个进程的级别可能会由于其它进程依赖于它而升高。一个为其它进程提供 服务的进程级别永远高于使用它服务的进程。比如说,如果A进程中的内容提供者为进程B中的客户端提供服务,或进程A中的服务为进程B中的组件所绑定,则A 进程最低也会被视为与进程B拥有同样的重要性。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11678955.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存