Android动态启用和禁用Component(activity,receiver,service)

本文介绍了如何在Android系统中动态地启用和禁用Activity、BroadcastReceiver和Service。通常这些组件在AndroidManifest.xml中配置,但通过PackageManager的setComponentEnabledSetting方法,可以实现对应用组件的运行时控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android系统有Activity、BroadcastReceiver、Service和ContentProvider四个组件(Component)。

通常这些组件都会配置在AndroidManifest.xml文件中,可以使用PackageManager类的setComponentEnabledSetting方法来动态启用和禁用Application中的某个组件。

1、AndroidManifest.xml中配置android:enabled属性
android:enabled=”false”,禁用组件

<activity
     android:configChanges="keyboardHidden|orientation"
     android:enabled="false"   
     android:name="DynamicActivity" >
</activity>

2、PackageManager类用于启用和禁用组件的相关代码

package com.orgcent.dynamicicon;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

/**
 * 在AndroidManifest.xml中设置Component的android:enabled属性来启用和禁用组建
 */
public class DynamicEnableActivity extends Activity implements OnClickListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btn = findView(this, R.id.btnStart);
        btn.setOnClickListener(this);

        btn = findView(this, R.id.btnToggle);
        btn.setOnClickListener(this);
    }

    @SuppressWarnings("unchecked")
    private final <T> T findView(Activity cx, int resId) {
        T findViewById = (T) cx.findViewById(resId);
        return findViewById;
    }
    //获取activity在androidManifest.xml中的配置信息
    private ActivityInfo getActivityInfo(ComponentName name) {
        final PackageManager pm = getPackageManager();
        try {
            return pm.getActivityInfo(name, PackageManager.GET_META_DATA);
        } catch (Exception e) {
        }
        return null;
    }

    @Override
    public void onClick(View v) {
        final PackageManager pm = getPackageManager();
        final ComponentName comptName = new ComponentName(this,
                DynamicActivity.class);
        final ActivityInfo info = getActivityInfo(comptName);

        switch (v.getId()) {
        case R.id.btnStart:
            if (null != info) { System.out.println(info.enabled);
                Intent it = new Intent();
                it.setComponent(comptName);
                startActivity(it);
            } else {
                Toast.makeText(this, "组件已禁用,无法使用", Toast.LENGTH_LONG).show();
            }
            break;

        case R.id.btnToggle:
            if (null == info) {
                // PackageManager.DONT_KILL_APP,表示更改Component状态后,不杀死应用。禁用某些组件可能导致正在运行的应用无法使用某功能。
                pm.setComponentEnabledSetting(comptName,
                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                        PackageManager.DONT_KILL_APP);
                Toast.makeText(this, "组件已启用", Toast.LENGTH_LONG).show();
            } else {
                pm.setComponentEnabledSetting(comptName,
                        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                        PackageManager.DONT_KILL_APP);
                Toast.makeText(this, "组件已禁用", Toast.LENGTH_LONG).show();
            }
            break;
        }
    }
}


为什么日志不显示 package com.example.planting import android.os.Bundle import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import com.example.planting.ui.theme.PlantingTheme class MainActivity : ComponentActivity() { private lateinit var mqttManager: MQTTManager //private lateinit var receiver: BroadcastReceiver override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.d("MainActivity", "Debug log message"); Log.e("MainActivity", "Error log message"); Log.i("MainActivity", "Info log message"); Log.w("MainActivity", "Warning log message"); Log.v("MainActivity", "Verbose log message"); enableEdgeToEdge() setContent { PlantingTheme { Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> Greeting( name = "Android", modifier = Modifier.padding(innerPadding) ) } } } // setContentView(R.layout.activity_main) Log.d("MainActivity", "我不跟SD谈恋爱") // 初始化MQTT(注意上下文传递方式) //mqttManager = MQTTManager(this).apply { // connect() //} } } @Composable fun Greeting(name: String, modifier: Modifier = Modifier) { Text( text = "Hello $name!", modifier = modifier ) } @Preview(showBackground = true) @Composable fun GreetingPreview() { PlantingTheme { Greeting("Android") } }
03-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值