【问题标题】:Launch activity with startActivityForResult in a service在服务中使用 startActivityForResult 启动活动
【发布时间】:2014-05-14 16:02:41
【问题描述】:

我的 startActivityForResult 函数有问题。

我有一个活动 MqttClientActivity

public class MqttClientActivity extends Activity {

    static final int ACTIVATION_REQUEST = 47; // identifies our request id

    private static Context context;

    static DevicePolicyManager devicePolicyManager;
    static ComponentName demoDeviceAdmin;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        MqttClientActivity.context = getApplicationContext();

        // Initialize Device Policy Manager service and our receiver class
        devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
        demoDeviceAdmin = new ComponentName(this, DemoDeviceAdminReceiver.class);
    }

    public static void test() {
        boolean active = devicePolicyManager.isAdminActive(demoDeviceAdmin);
        if (active) {
                         //do something...
        }
        else {
            // Activate device administration
            Intent intent = new Intent(
                    DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
                    demoDeviceAdmin);
            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                    "Your boss told you to do this");
            startActivityForResult(intent, ACTIVATION_REQUEST);
        }
    }
}

我有这门课:

https://github.com/dobermai/android-mqtt-push/blob/master/src/de/eclipsemagazin/mqtt/push/MQTTService.java

然后:

https://github.com/dobermai/android-mqtt-push/blob/master/src/de/eclipsemagazin/mqtt/push/PushCallback.java

在后一个类中,我想在 messageArrived 函数中调用我的测试函数 (MqttClientActivity),我该怎么做?我已经将函数设置为静态,变量“devicePolicyManager”和“demoDeviceAdmin”设置为静态,但我无法启动 activty...

谁能帮帮我?

谢谢

【问题讨论】:

    标签: java android service static android-activity


    【解决方案1】:

    首先,您不能从Service 调用startActivityForResult()。充其量,您可以通过Service 拨打startActivity()

    其次,您不能从static 方法调用startActivity()(或startActivityForResult()),除非在Context(或Activity 用于startActivityForResult())上调用它,因为它们不是@987654331 @ 方法。

    【讨论】:

    • 但是我必须检索活动的结果,这就是为什么我必须使用 startActivityForResult()。 (想知道用户是否同意使用设备管理员)
    • @user2021346:那么您应该在您的Activity 上调用startActivityForResult(),以响应用户输入(或该活动的启动)。
    • 在活动中确定:声明静态变量是否正确?因为使用静态变量我不能调用 startactivityforresult...
    • @user2021346:“声明静态变量是否正确?”——我不明白你的意思。将Activity 本身放入静态数据成员会导致内存泄漏。更重要的是,您似乎认为通过弹出基于 MQTT 推送消息的活动来打断用户是个好主意。用户很可能不同意您的观点。对于“嘿,让我成为设备管理员”活动尤其如此——用户会将​​此视为您是恶意软件作者的确定信号。 响应用户输入启动ACTION_ADD_DEVICE_ADMIN
    猜你喜欢
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多