如何在MainActivity之前启动java类



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

  1. 我删除了蓝牙中的setContentView并注册,因为它们没有布局
  2. 我曾有意将一项活动介绍给另一项活动。蓝牙进行注册,然后注册到MainActivity
  3. 我更改了AndroidManifest这是代码:

    <?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>
    

    在我启动我的程序后,我还没来得及做任何事情,它就突然关闭了。你能告诉我我的程序出了什么问题吗?还是我遗漏了什么?谢谢(似乎我不能在这里发布我的日志(

BluetoothonCreate中执行以下操作:

@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();
}

在register.java.中使用类似的代码

这就是你的确切问题的解决方案。然而,这不是理想的做事方式。

从应用程序类调用蓝牙类。像这个

public class AppTest extends Application {
@Override
public void onCreate() {
super.onCreate();
//Call your bluetooth class
}
}

并在androidmanifest文件中添加您的应用程序类名:

<application
android:name=".AppTest">

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

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
}
}
}

您应该发布您得到的错误,但我会向您提供最可能的解决方案。您的应用程序可能会崩溃,因为类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));
}

最新更新