Как запустить Intent в аутсорсинговой статической функции?

Я следую этому руководству, чтобы начать работу с Bluetooth: https://www.youtube.com/watch?v=y8R2C86BIUc

Я хочу передать поддержку Bluetooth отдельному классу и вызвать его из MainActivity.

Я сделал новое намерение, но после видео я не могу запустить намерение.

Я попытался импортировать:

android.support.v7.app.AppCompatActivity;
android.support.v4.content.ContextCompat;

Но в обоих случаях не получилось.

Без импорта Android Studio сообщает: «Не удается разрешить метод».

ГЛАВНЫЙ

package com.example.lenkzeitapplikation_01;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startBT.switch_BT_ON();
    }

}

СТАРТБТ

import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.support.v4.content.ContextCompat;

import com.fleetboard.sdk.lib.android.log.Log;


public class startBT {

    private static final String Tag ="StartBT";
    static BluetoothAdapter mBluetoothAdapter;

    public static void switch_BT_ON(){
        if(mBluetoothAdapter == null){
            Log.d(Tag, "No BT adapter");
        }if(!mBluetoothAdapter.isEnabled()){
            Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
           startActivity(enableBTIntent);

             //mBluetoothAdapter.enable();
        }

    }

}

Использование import android.support.v4.content.ContextCompat:

Ошибка: метод startActivity в классе ContextCompat не может быть применен к заданным типам; required: Context,Intent,Bundle found: Intent Reason: списки фактических и формальных аргументов различаются по длине


person Alpha-Centauri    schedule 16.05.2019    source источник
comment
вам нужен экземпляр Context для вызова startActivity. Простое решение: назовите его как startBT.switch_BT_ON(); и измените сигнатуру метода на switch_BT_ON(Context context) и измените вызов на context.startActivity(enableBTIntent)   -  person Tim    schedule 16.05.2019
comment
@Tim Castelijns, не могли бы вы сказать мне, что такое экземпляр Context?   -  person Alpha-Centauri    schedule 16.05.2019


Ответы (1)


Важно

Хорошо, обо всем по порядку: Activity — это один из различных типов Context. И: startActivity — это метод, который есть у Context объектов.

Пояснение

Если вы хотите начать действие, вы должны использовать объект Context. Вот почему это работало в первую очередь, в вашем MainActivity.

Теперь, когда вы переместили код в другой класс, если вы хотите использовать метод startActivity, у вас должна быть ссылка на объект Context.

Но... Как?

public class startBT {

    public static void switch_BT_ON(Context context){
        //... Your logic
        context.startActivity(intent);
    }
}

В вашей деятельности:

startBT.switch_BT_ON(this);

Параметр this — это сам MainActivity, который по определению является Context.

Это означает, что:

switch_BT_ON требуется Context.

MainActivity говорит: "Вот, используй меня".

Рекомендации Это классическое базовое ООП-мышление. Изучите объектно-ориентированное программирование, классы и наследование, чтобы узнать, почему метод startActivity работал на Acivity, а не за его пределами, передавая объекты и обрабатывая разные области.

Прочитайте краткий ответ о что такое Android Context. Или исследуйте документацию.

person Vitor Hugo Schwaab    schedule 16.05.2019