Java 我怎样才能让我的活动表现出来?

Java 我怎样才能让我的活动表现出来?,java,android,google-glass,google-gdk,Java,Android,Google Glass,Google Gdk,我在一个新项目中遵循Compass示例中使用的模式,并使大部分逻辑正常工作。然而,当我在live card显示时点击时,我听到“咔嗒”声,但我的菜单活动没有显示。我想我错过了一块拼图,但我还没有弄清楚到底是什么 当我点击时,除了点击,我还在logcat中看到: 01-08 10:02:26.796: I/ActivityManager(196): START {flg=0x10008000 cmp=com.example.speeddisplay/.SpeedDisplayMenuActivit

我在一个新项目中遵循Compass示例中使用的模式,并使大部分逻辑正常工作。然而,当我在live card显示时点击时,我听到“咔嗒”声,但我的菜单活动没有显示。我想我错过了一块拼图,但我还没有弄清楚到底是什么

当我点击时,除了点击,我还在logcat中看到:

01-08 10:02:26.796: I/ActivityManager(196): START {flg=0x10008000 cmp=com.example.speeddisplay/.SpeedDisplayMenuActivity} from pid -1
所以看起来它应该开始我的活动,但它没有出现。下面是一些相关的代码…虽然我不确定问题出在哪里

AndroidManifest.xml中的服务部分:

    <service
        android:name="com.example.speeddisplay.service.SpeedService"
        android:enabled="true"
        android:icon="@drawable/ic_drive_50"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="com.google.android.glass.action.VOICE_TRIGGER" />
        </intent-filter>

        <meta-data
            android:name="com.google.android.glass.VoiceTrigger"
            android:resource="@xml/voiceinput_speeddisplay" />
    </service>
这是我的SpeedDisplayMenuActivity.java。这些方法都没有被调用

public class SpeedDisplayMenuActivity extends Activity {

private SpeedService.SpeedBinder speedService;
private boolean mResumed;

private ServiceConnection mConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        if (Constants.DEBUG) {
            Log.e("Service Stuff", "Service connected.");
        }
        if (service instanceof SpeedService.SpeedBinder) {
            speedService = (SpeedService.SpeedBinder) service;
            openOptionsMenu();
        }
        if (Constants.DEBUG) {
            Log.e("Service Stuff", "service was an instance of " + service.getClass().getName());
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        // Do nothing.
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    if(Constants.DEBUG){
        Log.e("Menu", "Created.");
    }
    super.onCreate(savedInstanceState);
    bindService(new Intent(this, SpeedService.class), mConnection, 0);
}

@Override
protected void onResume() {
    if(Constants.DEBUG){
        Log.e("Menu", "Resumed.");
    }
    super.onResume();
    mResumed = true;
    openOptionsMenu();
}

@Override
protected void onPause() {
    if(Constants.DEBUG){
        Log.e("Menu", "Paused.");
    }
    super.onPause();
    mResumed = false;
}

@Override
public void openOptionsMenu() {
    if (Constants.DEBUG) {
        Log.e("Options Menu", "Open");
    }
    if (mResumed && speedService != null) {
        if (Constants.DEBUG) {
            Log.e("Options Menu", "Open with correct params");
        }
        super.openOptionsMenu();
    } else {
        if (Constants.DEBUG) {
            Log.e("Options Menu", "Open with INCORRECT params");
        }
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (Constants.DEBUG) {
        Log.e("Options Menu", "Created");
    }
    getMenuInflater().inflate(R.menu.speed, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (Constants.DEBUG) {
        Log.e("Options Menu", "Item Selected");
    }
    switch (item.getItemId()) {
    // case R.id.read_aloud:
    // mCompassService.readHeadingAloud();
    // return true;
    case R.id.stop:
        if (Constants.DEBUG) {
            Log.e("Options Menu", "Stop");
        }
        stopService(new Intent(this, SpeedService.class));
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

@Override
public void onOptionsMenuClosed(Menu menu) {
    if (Constants.DEBUG) {
        Log.e("Options Menu", "Closed");
    }
    super.onOptionsMenuClosed(menu);

    unbindService(mConnection);

    // We must call finish() from this method to ensure that the activity
    // ends either when an
    // item is selected from the menu or when the menu is dismissed by
    // swiping down.
    finish();
}

有人看到我遗漏了什么吗?

没错,在这种情况下,宣布SpeedDisplayMenuActivity是问题所在

我见过很多其他类型的异常/崩溃(通常发生在Android环境中)在Glass中被优雅地处理的例子


这无疑有利于用户体验,但对开发没有什么困难。希望将来会有一些设置来启用异常

您是否在清单中注册了SpeedDisplayMenuActivity?我看不到SpeedDisplayMenuActivity.java它在清单文件中的任何位置都有定义。你查过了吗?你们都很棒。我总是忘记在我的清单中添加新的活动……我只是习惯了“正常”的Android应用程序崩溃,这就是我的记忆:)看起来玻璃器皿只是优雅地失败了。是的,我喜欢优雅地处理问题,但日志中的消息会很有帮助!我相信他们仍在研究这样的细节。希望如此。否则就很难理解到底发生了什么。
public class SpeedDisplayMenuActivity extends Activity {

private SpeedService.SpeedBinder speedService;
private boolean mResumed;

private ServiceConnection mConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        if (Constants.DEBUG) {
            Log.e("Service Stuff", "Service connected.");
        }
        if (service instanceof SpeedService.SpeedBinder) {
            speedService = (SpeedService.SpeedBinder) service;
            openOptionsMenu();
        }
        if (Constants.DEBUG) {
            Log.e("Service Stuff", "service was an instance of " + service.getClass().getName());
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        // Do nothing.
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    if(Constants.DEBUG){
        Log.e("Menu", "Created.");
    }
    super.onCreate(savedInstanceState);
    bindService(new Intent(this, SpeedService.class), mConnection, 0);
}

@Override
protected void onResume() {
    if(Constants.DEBUG){
        Log.e("Menu", "Resumed.");
    }
    super.onResume();
    mResumed = true;
    openOptionsMenu();
}

@Override
protected void onPause() {
    if(Constants.DEBUG){
        Log.e("Menu", "Paused.");
    }
    super.onPause();
    mResumed = false;
}

@Override
public void openOptionsMenu() {
    if (Constants.DEBUG) {
        Log.e("Options Menu", "Open");
    }
    if (mResumed && speedService != null) {
        if (Constants.DEBUG) {
            Log.e("Options Menu", "Open with correct params");
        }
        super.openOptionsMenu();
    } else {
        if (Constants.DEBUG) {
            Log.e("Options Menu", "Open with INCORRECT params");
        }
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (Constants.DEBUG) {
        Log.e("Options Menu", "Created");
    }
    getMenuInflater().inflate(R.menu.speed, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (Constants.DEBUG) {
        Log.e("Options Menu", "Item Selected");
    }
    switch (item.getItemId()) {
    // case R.id.read_aloud:
    // mCompassService.readHeadingAloud();
    // return true;
    case R.id.stop:
        if (Constants.DEBUG) {
            Log.e("Options Menu", "Stop");
        }
        stopService(new Intent(this, SpeedService.class));
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

@Override
public void onOptionsMenuClosed(Menu menu) {
    if (Constants.DEBUG) {
        Log.e("Options Menu", "Closed");
    }
    super.onOptionsMenuClosed(menu);

    unbindService(mConnection);

    // We must call finish() from this method to ensure that the activity
    // ends either when an
    // item is selected from the menu or when the menu is dismissed by
    // swiping down.
    finish();
}