【问题标题】:Getting Android apk to run after installing (reboot)?安装(重启)后让Android apk运行?
【发布时间】:2016-10-10 21:14:49
【问题描述】:

您好,我正在尝试让我的 Android 应用程序(它没有 UI,它只是应该是后台服务)在安装时运行,或者至少在设备重启时运行。到目前为止,这是我的工作,有人知道为什么在安装 apk 并重新启动设备时它不会启动吗?

Android 清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="gitlab.project" >
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application android:label="@string/app_name" >
    <activity
        android:name="gitlab.project.MainActivity"
        android:label="@string/app_name"
        android:theme = "@android:style/Theme.NoDisplay">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </activity>

    <receiver
            android:name="gitlab.project.AutoStart"
            android:enabled="true"
            android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
    <service android:name="gitlab.project.AlphaService"
             android:enabled="true"
             android:exported="true" />
</application>
</manifest>

主活动:

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(this, AlphaService.class);
    this.startService(intent);
}
}

AlphaService:

public class AlphaService extends Service implements
    GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

private Profiler profiler;
private AlphaApiClient alphaApiClient;
private GoogleApiClient googleApiClient;
private int batteryHealth;

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
    batteryHealth = intent.getIntExtra(BatteryManager.EXTRA_HEALTH, 2);

    if (googleApiClient == null) {
        googleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }
    googleApiClient.connect();

    return Service.START_STICKY;
}

@Override
public void onConnected(Bundle connectionHint) {
    ProcService procService = new DefaultProcService();
    SystemInformationService systemInformationService = new SystemInformationService(googleApiClient, getContentResolver());
    profiler = new Profiler(procService, systemInformationService);
    alphaApiClient = new AlphaApiClient(getString(R.string.USERNAME), getString(R.string.PASSWORD));
    Thread thread = new Thread(new Runnable(){
        @Override
        public void run() {
            Log.d("Alpha service", "Profiling system info...");
            AndroidSystem androidSystem = profiler.profile(batteryHealth);
            String url = getString(R.string.API_URL);
            alphaApiClient.doPostRequest(androidSystem, url);
        }
    });
    thread.start();

    //Stop service once it finishes its task
    stopSelf();
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

@Override
public void onDestroy() {
    AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE);
    alarm.set(
            AlarmManager.RTC_WAKEUP,
            System.currentTimeMillis() + (4000 * 60 * 60),
            PendingIntent.getService(this, 0, new Intent(this, AlphaService.class), 0)
    );
}
}

自动启动(广播接收器):

public class AutoStart extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    Intent i = new Intent(context, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);

    context.startService(new Intent(context, AlphaService.class));
}
}

知道为什么我的后台服务无法运行吗?我可以使用 adb 让它运行,但在尝试从手机/平板电脑手动安装时却不行。任何帮助是极大的赞赏。

【问题讨论】:

  • 应用程序不会运行任何服务或广播接收器,除非它处于启动状态。从启动器或通过 ADB 运行后,它处于启动状态。 1) 进行一项活动,该活动将 a) 启动您的服务并 b) 禁用自身 (stackoverflow.com/questions/17409907/…)。 2)制作一个开机接收器(stackoverflow.com/questions/5290141/…)。
  • 我的 AutoStart 启动接收器是否丢失了什么?
  • 为什么在产生线程后立即停止服务?
  • NoDisplay 活动必须在finish() 返回之前onCreate()

标签: android android-activity android-service android-manifest android-broadcastreceiver


【解决方案1】:

除非处于启动状态,否则该应用不会运行任何服务或广播接收器。从启动器或通过 ADB 运行后,它处于启动状态。

1) 进行一项活动,该活动将 a) 启动您的服务并 b) 禁用自身 (How to enable and disable a component?)。

2) 制作启动接收器 (Android BroadcastReceiver on startup - keep running when Activity is in Background)。


您的启动接收器已经在启动服务,它不需要启动活动。该活动只需要在安装后启动一次。这是正确的设置。

AndroidManifest.xml

<activity
    android:name="gitlab.project.MainActivity"
    android:theme = "@android:style/Theme.NoDisplay">
    <intent-filter>
        <!-- Activity needs to show up in launcher. -->
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<receiver
        android:name="gitlab.project.AutoStart"
        android:enabled="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

AutoStart.java

public class AutoStart extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction()) {        
            context.startService(new Intent(context, AlphaService.class));
        }
    }
}

【讨论】:

    【解决方案2】:

    我认为问题出在您的 AutoStart 类中:

    Intent i = new Intent(context, MainActivity.class);
    

    您将意图与 MainActivity 打包在一起。尝试将其更改为 AlphaService。

    【讨论】:

    • 我还尝试从我的 AutoStart 类中删除前 3 行,以便它只启动服务并且它也不起作用。这是你的建议吗?
    • 是的。唔。我实现了类似的东西,可能对你有用:github.com/karljamoralin/internet-speed-meter
    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 2017-05-23
    • 1970-01-01
    • 2017-01-18
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多