如何在MainActivity之前启动java类
我正在创建一个项目,需要在运行和启动主活动之前运行java类。我的java类是:Bluetooth.java、register.java、DatabaseHelper.java。我需要运行的程序顺序:Bluetooth>register>MainActivity。MainActivity是唯一具有布局的活动。我已经做了:如何在MainActivity之前启动java类,java,android,Java,Android,我正在创建一个项目,需要在运行和启动主活动之前运行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”活动来检查值。没有布局的活动只会向用户显示一个空白屏幕,用户可能会认为您的应用程序已冻结