Android创建窗口小部件,以启动其他应用程序,但在后台
问题描述:
我有一个Android收音机不会自动启动应用程序,但它可以从窗口小部件启动应用程序。我想创建一个小部件来启动我选择的各种应用程序,但我希望它们只能打开其他应用程序,然后关闭它们或在后台打开,因此一旦所有应用程序启动,主屏幕仍显示。我已经有一个简单的AppWidgetProvider我正在使用从另一个项目:Android创建窗口小部件,以启动其他应用程序,但在后台
public class AppStarterWidget extends AppWidgetProvider {
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
}
@Override
public void onUpdate(final Context context, final AppWidgetManager appWidgetManager,
final int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int widgetId : appWidgetIds) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget_layout);
remoteViews.setInt(R.id.btnStartActivity, "setBackgroundResource",
R.drawable.circle_off);
try {
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.setComponent(new ComponentName("com.my.app", "Qualified name"));
PendingIntent pendingIntent = PendingIntent.getActivity(
context, 0, intent, 0);
remoteViews.setOnClickPendingIntent(R.id.btnStartActivity, pendingIntent);
appWidgetManager.updateAppWidget(widgetId, remoteViews);
//handler.postDelayed(this, 10000);
} catch (ActivityNotFoundException e) {
Toast.makeText(context.getApplicationContext(),
"There was a problem loading the application: ",
Toast.LENGTH_SHORT).show();
}
}
答
好的。以为我会为其他可能想在“背景”中启动应用的人提供一些小小的工作。我使用引号,因为它实际上不在背景中,但看起来像。
免责声明:我创建了一个例程来启动程序,并立即开始后我重新启动主屏幕。由于我的观点是要有一个小部件来运行应用程序,通常会得到启动完成的广播,如果相同的代码未被启动程序活动调用,则可能无法工作。
您还将需要处理有关如何以及何时调用它的逻辑,因为它会转到主屏幕。因此,如果所谓的它在前台有一个活动,它将被移动到后台。
此外,这不是完整的代码,但应该足以给你的想法。要求包名的SharedPreference为true才能启动应用程序。否则它只是迭代并完成。如果你想放置一个定时器循环,我还包含了一些代码来处理调用,而不需要重新启动应用程序。
public class LaunchAppInBackground extends AppCompatActivity {
static SharedPreferences sPrefs;
static boolean bUpdatingAppSelection;
private static ArrayList<String> alStartedApps = new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sPrefs = PreferenceManager.getDefaultSharedPreferences(this);
startAllApps(this);
}
static void startAllApps(Context context) {
if(bUpdatingAppSelection) {
return;
}
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
final List<ResolveInfo> launchables = context.getPackageManager()
.queryIntentActivities(mainIntent, 0);
// Loop through all apps
for (ResolveInfo launchable : launchables) {
// If app is in Preferences
if (sPrefs.getBoolean(launchable.activityInfo.packageName, false)) {
// Check if already launched
Log.i("AI", "Checking " + launchable.activityInfo.applicationInfo.packageName);
boolean bAlreadyLaunched = false;
for (String s : alStartedApps) {
if (s.equals(launchable.activityInfo.applicationInfo.packageName)) {
bAlreadyLaunched = true;
}
}
// Start if not already launched
if (!bAlreadyLaunched) {
alStartedApps.add(launchable.activityInfo.applicationInfo.packageName);
startApp(launchable, context);
} else {
Log.i("AI", launchable.activityInfo.applicationInfo.packageName
+ " already running");
}
}
}
}
static void startApp(ResolveInfo launchable, Context context) {
if(launchable != null) {
ActivityInfo activity = launchable.activityInfo;
ComponentName name = new ComponentName(activity.applicationInfo.packageName,
activity.name);
Intent i = new Intent(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
i.setComponent(name);
context.startActivity(i);
loadHomeScreen(context);
Log.i("AI", "Launched " + activity.applicationInfo.packageName);
}
}
static void loadHomeScreen(Context context) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
context.startActivity(intent);
}
}