Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MainActivity之前启动java类_Java_Android - Fatal编程技术网

如何在MainActivity之前启动java类

如何在MainActivity之前启动java类,java,android,Java,Android,我正在创建一个项目,需要在运行和启动主活动之前运行java类。我的java类是:Bluetooth.java、register.java、DatabaseHelper.java。我需要运行的程序顺序:Bluetooth>register>MainActivity。MainActivity是唯一具有布局的活动。我已经做了: 我删除了Bluetooth中的setContentView并注册,因为它们没有布局 我曾试图将一项活动与另一项活动联系起来。蓝牙注册,然后注册到MainActivity 我换了

我正在创建一个项目,需要在运行和启动主活动之前运行java类。我的java类是:Bluetooth.java、register.java、DatabaseHelper.java。我需要运行的程序顺序:Bluetooth>register>MainActivity。MainActivity是唯一具有布局的活动。我已经做了:

  • 我删除了Bluetooth中的setContentView并注册,因为它们没有布局
  • 我曾试图将一项活动与另一项活动联系起来。蓝牙注册,然后注册到MainActivity
  • 我换了清单 代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.windows8.registerlogin">
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    
    <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".Bluetooth" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
    
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".Register"
        android:label="@string/app_name"/>
    <activity android:name=".MainActivity"
        android:label="@string/app_name"/>
    </application>
    </manifest>
    
    
    
    在我启动我的程序后,它在我做任何事情之前突然关闭了。 你能告诉我我的程序出了什么问题吗?还是我遗漏了什么?谢谢(看来我不能在这里发布日志)


  • 你应该张贴你得到的错误,但我会给你最可能的解决办法。 您的应用程序可能会崩溃,因为类
    Bluetooth
    未扩展活动,但已标记为活动

    创建一个启动程序活动,该活动将有一个加载屏幕,仅用于向用户显示应用程序正在运行。此活动将是第一个可以调用所需类的活动,只有这样才能启动主活动

    因此onCreate()方法将如下所示

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        setContentView(R.layout.launcher_activity);
    
        new Bluetooth();
        new Register();
    
        startActivity(new Intent(this, MainActivity.class));
    }
    

    Bluetooth
    onCreate
    中,执行以下操作:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        new AsyncTask<Void, Void, Void>(){
    
            @Override
            protected Void doInBackground(Void... voids) {
                initBluetooth();    //Perform any operations
                return null;
            }
    
            @Override
            protected void onPostExecute(Void aVoid) {
                startActivity(Bluetooth.this, register.java);
            }
        }.execute();
    
    }
    
    @覆盖
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    新建异步任务(){
    @凌驾
    受保护的空位背景(空位…空位){
    initBluetooth();//执行任何操作
    返回null;
    }
    @凌驾
    受保护的void onPostExecute(void避免){
    startActivity(Bluetooth.this、register.java);
    }
    }.execute();
    }
    
    在register.java中使用类似的代码


    这就是你的问题的解决方案。但是,这不是一种理想的方法。

    使用启动器活动是一个好主意,但请确保不要通过在
    onCreate
    中初始化内容来锁定UI线程,也不要将上下文泄漏给匿名异步任务。 根据您的描述,蓝牙和注册不需要是活动。假设这是正确的,并且您可以使它们成为独立的类,下面是一个示例,说明了这一点:

    private AsyncTask<Void, Void, Integer> loader = null;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.launcher_activity);
        loader = new LoadStuff(this);
        loader.execute();
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        if( loader != null ) {
            loader.cancel(true);
            loader = null;
        }
    }
    
    static class LoadStuff extends AsyncTask<Void, Void, Integer> {
    
        WeakReferences<Activity> context;
    
        LoadStuff(Activity context) {
            this.context = new WeakReference<>(context);
        }
    
        @Override
        protected void onPreExecute() {
        }
    
        @Override
        protected Integer doInBackground(Void... params) {
            // assuming they're singletons
            Bluetooth.initialize();
            Register.initialize();
            return 0; // or pass an error code if these fail
        }
    
        @Override
        protected void onPostExecute(Integer result) {
            Activity c = context.get();
            if( c != null ) {
                Intent intent = new Intent(c, MainActivity.class);
                c.startActivity(intent);
                c.finish(); // don't let the user come back to this screen
            }
        }
    }
    
    private AsyncTask loader=null;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.launcher_活动);
    loader=新的LoadStuff(本);
    loader.execute();
    }
    @凌驾
    公共空间{
    super.ondestory();
    if(加载程序!=null){
    loader.cancel(true);
    加载器=null;
    }
    }
    静态类LoadStuff扩展异步任务{
    WeakReferences语境;
    LoadStuff(活动上下文){
    this.context=新的WeakReference(context);
    }
    @凌驾
    受保护的void onPreExecute(){
    }
    @凌驾
    受保护的整数doInBackground(Void…params){
    //假设他们是单身
    Bluetooth.initialize();
    Register.initialize();
    返回0;//如果失败,则传递错误代码
    }
    @凌驾
    受保护的void onPostExecute(整数结果){
    活动c=context.get();
    如果(c!=null){
    意向意向=新意向(c,MainActivity.class);
    c、 星触觉(意向);
    c、 finish();//不要让用户返回此屏幕
    }
    }
    }
    
    从应用程序类调用Bluetooth类。像这样

    public class AppTest extends Application {
    
    @Override
    public void onCreate() {
        super.onCreate();
       //Call your bluetooth class
    }
    }
    
    并在androidmanifest文件中添加应用程序类名:

    <application
        android:name=".AppTest">
    
    
    
    创建一个空活动(加载屏幕),等待所有必要的组件加载,然后继续执行主活动。很抱歉,bluetooth和register都是活动,但我没有使用它们的布局。我删除了他们的版式。如果没有版式,为什么他们甚至需要活动?活动是一个GUI元素,用于向用户显示某些内容。如果你不这样做,你根本不需要让它们成为活动……我把它们当作活动来使用,因为我是基于检查每个活动来创建项目的,以确保我的程序工作正常。例如,在活动蓝牙中,我可以通过在布局中显示数据来检查是否收到了数据。我认为如果所有的东西都被检查并运行起来,那么合并这些程序就更容易了。我建议不要把它变成一项活动。如果它是一个活动,你就不能保证它会一直存在(Android系统可以杀死没有显示的活动来保存系统资源)。一个更好的主意是创建某种“BluetoothManager”类来获取应用程序上下文,如果无法使用Espresso(或类似软件)对其进行测试,则创建一个“BluetoothDisplay”活动来检查值。没有布局的活动只会向用户显示一个空白屏幕,用户可能会认为您的应用程序已冻结