如何在启动智能手机时启动Android应用程序并保持运行直到用户将其关闭?

时间:2013-12-20 10:23:57

标签: android android-intent

当用户打开智能手机然后让它在后台运行时,我需要启动我的应用程序。有什么先决条件?我怎样才能成功呢?谢谢

5 个答案:

答案 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