当用户打开智能手机然后让它在后台运行时,我需要启动我的应用程序。有什么先决条件?我怎样才能成功呢?谢谢
答案 0 :(得分:5)
首先,Activity不能也不应该在后台运行。对于Android中的后台操作,您应该使用服务,但您可以通过以下代码隐藏活动。
步骤1: 在AndroidManifest.xml中设置权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
步骤2: 在接收器中添加这是intent过滤器,
<receiver android:name=".BootReciever">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
第三步: 现在,您可以从Receiver类的onReceive方法启动应用程序的第一个活动。
public class BootReciever extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Intent myIntent = new Intent(context, MainActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
myIntent.addCategory(Intent.CATEGORY_HOME);
context.startActivity(myIntent);
}
}
和你的活动Oncreate把这个
moveTaskToBack(true);
编辑:服务使用
public class BootReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent myIntent = new Intent(context, service.class);
context.startService(myIntent);
}
}
public class service extends Service
{
private static final String TAG = "MyService";
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void onDestroy() {
Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
Log.d(TAG, "onDestroy");
}
@Override
public void onStart(Intent intent, int startid)
{
Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
Log.d(TAG, "onStart");
}
}
并将此行添加到Androidmanifeist.xml
<service android:enabled="true" android:name=".service" />
了解更多信息,请参阅此处
http://blog.vogella.com/2011/12/11/automatically-starting-services-in-android-after-booting/
http://www.vogella.com/articles/AndroidServices/article.html
答案 1 :(得分:3)
Activity
不能也不应该在后台工作。对于Android中的后台操作,您应该使用Service
。
如需更多帮助,请查看此链接 -
Running activity in the background
要在启动时启动服务,请添加以下代码 -
添加权限 -
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
添加接收器 -
<receiver
android:name="com.<!your activity!>"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
在您的Activity类中 -
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent myIntent = new Intent(context, YourService.class);
context.startService(myIntent);
}
对于长时间运行的后台操作,应该使用服务。
答案 2 :(得分:2)
要在启动的设备上启动(在清单中):
<receiver android:name="MyBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
<category android:name="android.intent.category.HOME"></category>
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">
</uses-permission>
<uses-permission android:name="android.permission.REBOOT" />
让它继续运行:我不确定这是否可行,因为用户可以从设置菜单中停止应用...
答案 3 :(得分:1)
您需要使用由BroadcastReceiver触发的服务。
添加权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">
AAA BroacastReceiver检查启动完成或设备关闭的时间。 BroadcastReceiver声明为:
<receiver android:name="AAA">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.ACTION_SHUTDOWN"/>
</intent-filter>
</receiver>
这是BroadcastReceiver的实现
public class AAA extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Intent i = new Intent(context, BackgroundService.class);
if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
// The boot is completed - > Start the service
context.startService(i);
} else if (action.equals(Intent.ACTION_SHUTDOWN)) {
// The device is shutting down - Stop the service.
context.stopService(i);
}
}
}
正确完成启动后,广播启动服务;然而,当通过关闭设备通知广播AAA时,服务停止。
服务需要是一个粘性的(如果系统因内存需求而杀死它,系统会尽快重新创建)。服务的任务需要在服务主线程的单独线程中实现,以避免ANR。 这是一个例子:
public class BackgroundService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// Task to perform in the background - NOT in the MAIN thread (No UI changes)
}
});
t.start();
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
答案 4 :(得分:1)
在ANDROID中完成启动后启动后台服务/应用程序
在清单中添加此行
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:enabled="true" android:name=".OnBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
添加上面的行后,你的清单现在看起来像这样 例如:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyBackgroundService"
android:label="@string/app_name"
>
</service>
<receiver android:enabled="true" android:name=".OnBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>
如果您想在启动完成后启动服务,请使用此课程
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
public class OnBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (prefs.getBoolean("AUTOSTART_SERVICE", false)) {
context.startService(new Intent(context, MyBackgroundService.class));
}
}
}
}
如果您想在启动完成后自行启动应用程序,请使用此类
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
public class OnBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (prefs.getBoolean("AUTOSTART_APPLICATION", false)) {
Intent mIntent = new Intent();
mIntent.setClassName("com.example", "com.example.MainActivity");
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mIntent);
}
}
}
}
如果您有启用/禁用此启动接收器的设置选项,请按如下所示更改共享首选项的值,否则您可以从OnBootReceiver类中删除共享首选项
public void startAppOnBoot(Boolean start){
SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor mEditor = mPreferences.edit();
mEditor.putBoolean("AUTOSTART_APPLICATION", start);
mEditor.commit();
}
public void startSerciceOnBoot(Boolean start){
SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor mEditor= mPreferences.edit();
mEditor.putBoolean("AUTOSTART_SERVICE", start);
mEditor.commit();
}
如果您需要Android中的服务示例,请检查此链接: http://www.tutorialspoint.com/android/android_services.htm