gpt4 book ai didi

Android:启动时启动服务,但不启动 GUI

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:57:03 26 4
gpt4 key购买 nike

我正在编写一个包含两个主要组件的 Android 应用程序:一个在启动时启动的服务,以及一个 GUI,我只想在我通过其图标手动启动它时启动它,而不是在设备启动时启动。我知道如何在启动时启动服务,但它也会在启动时启动 GUI,这是我不想要的。

我认为这与 list 中的设置有关,但尽管尝试了很多方法,但我还没有想出如何防止 GUI 在启动时也启动。

我应该补充一点,我不会在启动时以编程方式启动 GUI。我确实在 GUI 的 Activity 类中引用了静态公共(public)变量,但我没有进行任何方法调用或向 GUI 的 Activity 发送任何 Intent 。

这是我的 list 。我究竟做错了什么?非常感谢。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="my.package.name"
android:versionCode="0"
android:versionName="0.1.0">

<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="17"/>

<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application android:icon="@drawable/icon"
android:label="@string/app_name"
android:allowBackup="true" >

<!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
I want MainActivity to only start when I
select its icon, NOT at boot time. However,
it always starts up at boot.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-->
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
MyBootReceiver properly starts up at boot time,
and it properly invokes MyBootService. At
the appropriate time, MyBootService invokes
RegisterActivity.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-->
<activity android:name=".RegisterActivity"
android:label="@string/app_name">
</activity>
<receiver
android:name=".MyBootReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="my.package.name" />
</intent-filter>
</receiver>
<service android:name=".MyBootService" />

</application>
</manifest>

添加广播接收器类:

package my.package.name;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyBootReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Intent bootIntent = new Intent(context, MyBootService.class);
bootIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(bootIntent);
}
}

添加服务类...

package my.package.name;

import java.util.ArrayList;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.TelephonyManager;

public class MyBootService extends Service {

private static final String GOOGLE_ACCOUNT_TYPE = "com.google";
private static final String GOOGLE_ACCOUNT_FEATURE = "service_ah";

private Context context = null;

@Override
public IBinder onBind(Intent intent) {
this.display("onBind");
return (null);
}

@Override
public void onCreate() {
super.onCreate();
}

@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);

AccountManager am = AccountManager.get(this);
am.getAccountsByTypeAndFeatures(GOOGLE_ACCOUNT_TYPE, new String[]{GOOGLE_ACCOUNT_FEATURE},
new AccountManagerCallback<Account[]>() {
@Override
public void run(AccountManagerFuture<Account[]> acclist) {
MyBootService parent = MyBootService.this;
Intent regIntent = new Intent(parent.getApplicationContext(), RegisterActivity.class);
try {
ArrayList<String> accountNameList = new ArrayList<String>();
for (Account a: acclist.getResult()) {
accountNameList.add(a.name);
}
regIntent.putStringArrayListExtra("accountNames", accountNameList);
try {
TelephonyManager tmgr = (TelephonyManager) parent.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
String phoneNo = tmgr.getLine1Number();
regIntent.putExtra("phoneNumber", phoneNo);
}
catch (Throwable t) {
}
}
catch (Throwable t) {
// put error message here
}
regIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
parent.startActivity(regIntent);
}
}, null);

return (START_STICKY);
}

@Override
public void onDestroy() {
this.display("onDestroy");
super.onDestroy();
}
}

更多信息

我想出了一些正在发生的事情。首先,我说我的 MainActivity 正在启动是错误的。经过更详细的调试,我发现它的 onCreate()onResume() 方法没有被调用。然而,应用程序的 View 出现了:黑屏,上面有应用程序的名称和默认图标。我最初将其误认为是完全启动的迹象。

当然,这首先提出了为什么该 View 会在启动时出现的问题。我有一些关于此的信息,尽管我仍然对发生的事情感到困惑。我删除了由 MyBootService 调用的 RegisterActivity 类的 onCreate() 方法。当调用 this.getIntent() 时,应用程序的 View 会在启动时显示。当 this.getIntent() 被注释掉时,应用程序的 View 不会在启动时显示。

请注意,这是 RegisterActivity 类的 onCreate()不是 MainActivity。

你们中有人知道在调用 this.getIntent() 时可能导致应用程序 View 显示的原因吗?

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

// If the following line is commented out, the
// application's view does not show up on boot;
// if the following line is not commented out,
// the application's view shows up.

Intent intent = this.getIntent();
}

最佳答案

我认为您看到的是 Android 用来使应用程序启动看起来更快的预览。此预览是根据您的 Activity 的主题制作的。

尝试为您的 RegisterActivity 设置一个自定义主题,它看起来更像最终结果。例如,如果您的 Activity 是一个对话框,请创建一个扩展 Theme.DialogTheme.Light.Dialog

的主题

您可以从 Cyril Mottier 获得有关此博客文章的更多信息:Android App Launching Made Gorgeous


编辑:改为实际回答问题

关于Android:启动时启动服务,但不启动 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16407189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com